Cstring与等号的比较
我有这个代码:
char *name = "George" if(name == "George") printf("It's George")
我认为cstring不能与==
符号进行比较,我必须使用strcmp
。 当我使用gcc(版本4.7.3)进行编译时,出现不明原因,这段代码可以工作。 我虽然这是错的,因为它就像比较指针,所以我在谷歌search,许多人说这是错误的,并与==
比较不能完成。 那么为什么这种比较方法有效?
我认为cstring不能与==符号进行比较,我必须使用strcmp
对。
我虽然这是错的,因为它就像比较指针,所以我在谷歌search,许多人说这是错误的,并与==比较不能完成
那也是。
那么为什么这种比较方法有效?
它不“工作”。 它似乎只是工作。
发生这种情况的原因可能是编译器优化:两个string文字是相同的,所以编译器实际上只生成它们的一个实例,并且每当引用string文字时,都使用这个完全相同的指针/数组。
只是提供一个参考@ H2CO3的答案:
C11 6.4.5 string文字
没有说明这些数组是否是不同的,只要它们的元素具有适当的值。 如果程序试图修改这样一个数组,行为是不确定的。
这意味着在你的例子中, name
(一个string“George”)和"George"
可能并不共享相同的位置,这取决于实现。 所以不要指望这一点,在其他机器可能会有不同的结果。
你所做的比较比较了两个string的位置 ,而不是它们的内容。 只是碰巧你的编译器决定只创build一个包含字符"George"
string文字。 这意味着存储在name
中的string的位置和第二个"George"
位置是相同的,所以比较返回非零。
不过编译器不需要这样做,但是它可以很容易地创build两个不同的string文字,不同的位置但内容相同,然后比较将返回零。
这将失败,因为你正在比较两个不同的string的两个不同的指针。 如果这个代码仍然有效,那么这是GCC的大量优化的结果,它只保留一个副本来优化大小。
使用strcmp()
。 链接 。
如果比较两个串,你比较这些string的基地址,而不是这些string中的实际字符。 用于比较string使用strcmp()
和strcasecmp()
库函数或像这样写程序。 以下不是完整的代码只是string比较所需的逻辑。
void mystrcmp(const char *source,char *dest) { for(i=0;source[i] != '\0';i++) dest[i] = source[i]; dest[i] = 0; }