| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1354 人关注过本帖
标题:学C之初的一个问题 关于字符串的 请教各位高手·。。
取消只看楼主 加入收藏
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
结帖率:100%
收藏
已结贴  问题点数:100 回复次数:9 
学C之初的一个问题 关于字符串的 请教各位高手·。。
貌似这个问题有些无聊。。

请见程序

程序代码:

#include <stdio.h>

int main(void)
{
    char *a = "ASDFGHJ";
    char *b = "ASDFGHJ";
   
    printf ("a=%lx b=%lx\n",a,b);
   
    return 0;
}



比如这个程序 我用gcc 默认参数编译 输出 a 和 b 是相等的

请问 是任何编译器的任何模式都是这种结果么 C语言的标准里面 对这个是怎么设计的呢

是【一定】相等 【可能】相等 还是【不应该】相等 呢

求指点 谢谢。。

/****************************************我只是分割线********************************************/

把我的感谢放在下面就埋没了 对不起各位。。

在这里感谢所有回复的人 你们的回复是我前进的动力

特别要感谢孔明等前辈的回复

分按照我的理解给的 每人都有。。

/****************************************我只是分割线********************************************/

我的结论 希望各位继续批评

1 此问题编译器相关 不同编译器实现不同 讨论意义不大

2 对于C语言中字符串的比较必须采用strcmp等函数实现 但在特定情况下 直接比较 即 "ASDF" == "ASDF" 是可能的

3 尽管有这种特性 也应该尽量避免采用这种模棱两可 或者说是没有规定的东西

4 有些书采用 "ASDF" != "ASDF" 来论证必须用strcmp比较字符串的做法是错误的

结束 再次感谢所有人


[ 本帖最后由 zklhp 于 2011-3-3 15:55 编辑 ]
搜索更多相关主题的帖子: 字符串 color 
2011-03-02 22:50
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
程序代码:
#include <stdio.h>

int main(void)
{
    if ("BCCN" == "BCCN")
    {
        printf ("=");
    }
   
    return 0;
}


相等否。。
2011-03-02 23:00
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用huangapple在2011-3-2 22:55:49的发言:


以上是win—tc里的结果

你试验了 也发现问题了罢。。
2011-03-02 23:02
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
我的想法

抛开C语言标准 只以我对计算机的理解看

我写的俩程序程序中 字符串都应该是相等的 最起码在【有智能】的编译器中应该是相等的

这里字符串为常量 如果编译器傻乎乎的在内存里搞两个相等的字符串 对于强壮性貌似没帮助 只会浪费内存。。

这样的话 字符串的不相等性就是相对的 比如对于定义的字符串 是直接写的常量 在内存中位置是相同的 相等即相等 没有疑问

但这个与C语言字符串不相等不矛盾 比如我动态生成的字符串就不相等啊 他们在内存中的位置不同

但是 这里我也记得不太准 不过貌似C书里面演示字符串不相等的例子 不相等的原因实际是编译器的不智能(待考。。)

Tc没法识别这俩字符串是否相等 或者不是没法 是没这种设计 反正它把这两个一样的东西原封不动的在内存里放了两遍

现在的问题就是 C标准怎么规定的了

如果C强制要求字符串不相等 那 我感觉这设计比较无聊。。 是为了不相等而不相等

或 C标准没说这档子事 这最好 留给编译器自由发挥

但我觉得 任何时候 编译器都不应该把一个字符串常量在内存中原封不动的放两遍。。。
2011-03-02 23:13
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用卧龙孔明在2011-3-2 23:23:55的发言:

非常建议楼主好好看书,如果你现在确实认真看了,那么建议你换一本书。
现在我来解释你这个问题:
首先,你要明白char *a = "ASDFGHJ";倒地是什么意思。
"ASDFGHJ"是一个常量,a指向这个常量。
验证a指向的是常量的方法:你试试a[0] = 1 可用否?程序崩溃了吧。
现在解释第一个问题,a,b都是指向了"ASDFGHJ"的字符指针,为什么a,b相同?因为你代码中a=,b=后的字符串是同一个字符串,编译器做了处理。
你可以做另外一个实验,让a=,b=后的字符串不相同,那么你会发现它们的地址是不同的。
而"BCCN" == "BCCN"中你所比较的,是两个常量字符串的地址,由之前所述,这两个常量字符串地址是相同的(好比1=1),所以输出了=。
最后,输出地址请用%p。
为楼主实践精神所感写下这些,希望对楼主有帮助。
ps: 现在的C语言教材水平参差不齐,大多数教材错误或不符合标准的内容不计其数,一些作者真是混蛋。

牛人回复了。。

您讲的这些我明白了 最后,输出地址请用%p。 这个是很好的建议

不过 我觉得您没说到点子上 虽然您解释的很详细 但与我的疑问不搭边。。
2011-03-02 23:32
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用pangding在2011-3-2 23:27:57的发言:

标准里对编译器的实现几乎没有限制。这个问题或者只从标准的角度出发看,或者就是从实践的角度去看。差别非常大。

刚刚没仔细看楼主 7 楼说的。看了之后确实发现楼主对标准的作用有一定的誤解。我明天出点标准的原文,可能能使楼主在很大程度上加深对“标准是什么”这个问题的理解~

我觉得您理解我这个问题很到位

希望能发标准看看 这样给您的分是很可观的哦。。

我貌似有标准来着 找不到了 懒得找了。。


2011-03-02 23:35
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
还有 骂作者的言论恕我不敢苟同。。

有时候我也觉得真XX 但回过头来想想 编一本书 哪怕是翻译 也挺不容易的 任何时候 这其中的功劳是不能抹杀的

那种故意出垃圾书的作者毕竟是少数罢。。。

而且 垃圾书自然由市场来淘汰 骂 不解决问题 口舌之快罢了 说不好听 泼妇骂街耳

得罪见谅。。
2011-03-02 23:44
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用pcbaichi在2011-3-3 00:09:15的发言:

楼主这样说是有道理,但lz肯定是没有那种深刻体会,否则我也不会来发表意见,孔明大牛说的真的没错

这个看怎么理解了

看的垃圾多了 肯定是嫉恶如仇 看到不好的就大骂一番

如果是自己亲身写过 知道其中的难处 我想 可能会多一点理解
2011-03-03 09:28
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
我的回复编辑原帖写上面了 再次感谢各位大大。。。
2011-03-03 15:56
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用pangding在2011-3-3 18:30:25的发言:

标准学习完毕。呵呵,标准里关于这方面的描述没我想像的复杂,和我以前学习其它的概念相比容易了不少。

字符串常量的语义是“字符串字面(string literal)"。 就是说这是个基本类型了,与 整型 之类的享有同等的地位。不过看标准里关于这个类型的描述量,并没看出同等。
行为是:静态储存域(static storage duration);在编译时分配空间,其大小应该正好等于字面值加上一个\0的位置;类型视为 字符型数组(注意不是 const char 型的)。虽然不是常字符类型,但对其更改的行为是未定义的。(我觉得在标准里没有特别描述 string literal 语义特征的时候,把它理解成非具名数组应该是最接近的。不然标准里有些规定就要自相矛盾了。)
在预处理阶段,要把毗邻的字面字串连接在一起。所有在预处理阶段应该处理的标记(token)规则,不对其生效。
标准描述了很多关于如何判断一个字面是 char 类型,还是 w_char 类型的规则。和你的问题关系不是很大,我就不介绍了。
可以用于对字符型数组的初始化,享有可选 {} 的权利(就是说可以写 char a[] = "abc", 或 char a[] = { "abc" } )。如果指定数组的大小足以容纳拖尾的 \0,或者未指定大小,则 \0 也被视为初值之一。

6.4.5 中的 第6条,提到了楼主敏感的那个问题,它的上下文是第5条(我下面都给出了)。它的内容是“是否将两个字面视为同一是未明确的,除非它们的元素有适宜的值。"(这是我翻译的,没什么权威性,请参见以下原文)。
这个适宜是个很模糊的说法。我的解释是:标准认为可以将两个一样的字符串视为同一个,也可以不。既 TC 的实现方法是可以接受的。
因为在编译器实现的时候必须考虑多字节编码,而不只是 ascii 编。比如很常见到大家在写注释,甚至字面的时候用中文。很多比较函数受本地环境影响,有很大的出入。比如“简历”的 英文 resume 和 法文 résume 在一定的系统环境变量控制下,会在 strcmp(我是这意思,当然你不能用这个函数比较非 char 类型) 里返回 true。所以标准在这为编译器的实现者提供了人性化,就是吃不准就分开,任何做法都符合标准。

“未明确(unspecified)”是指,标准对这个語法项给出了不止一种选择,但不做强迫选哪个的规定。实现必须选择其中一种,并在文档中申明。其它条目中出现的“未定义(undifined)”是指,标准对这种行为不施加任何限制,实现可以任意方式实现(甚至选择不实现)。

基本上就这些。我还从标准里选了点相关的条目。大家可以自己看看。
以下引用出自:ISO/IEC 9899:1999 (E)

再次感谢。。

学习中
2011-03-03 20:25
快速回复:学C之初的一个问题 关于字符串的 请教各位高手·。。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038684 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved