[英]C Strings Comparison with Equal Sign
我有这个代码:
char *name = "George"
if(name == "George")
printf("It's George")
我认为c字符串无法与==
符号进行比较,我必须使用strcmp
。 由于未知原因,当我使用gcc(版本4.7.3)编译时,此代码有效。 我认为这是错误的,因为它就像比较指针,所以我在谷歌搜索,很多人说这是错误的,与==
比较无法完成。 那么为什么这种比较方法有效?
我认为c字符串无法与==符号进行比较,我必须使用strcmp
对。
我虽然这是错误的,因为它就像比较指针,所以我在谷歌搜索,很多人说这是错误的,与==比较无法完成
那也是对的。
那么为什么这种比较方法有效?
它不“有效”。 它似乎只是起作用。
发生这种情况的原因可能是编译器优化:两个字符串文字是相同的,因此编译器实际上只生成它们的一个实例,并且每当引用字符串文字时使用相同的指针/数组。
只是提供@ H2CO3答案的参考:
C11 6.4.5 字符串文字
如果这些数组的元素具有适当的值,则这些数组是否不同是未指定的。 如果程序试图修改此类数组,则行为未定义。
这意味着在您的示例中, name
(字符串文字“George”)和"George"
可能也可能不共享相同的位置,这取决于实现。 所以不要指望这一点,它可能会在其他机器上产生不同的结果。
您所做的比较会比较两个字符串的位置 ,而不是它们的内容。 只是碰巧你的编译器决定只创建一个包含字符"George"
字符串文字。 这意味着存储在name
中的字符串的位置和第二个"George"
位置是相同的,因此比较返回非零。
然而,编译器不需要执行此操作 - 它可以轻松地创建两个不同的字符串文字,具有不同的位置但内容相同,然后比较将返回零。
这将失败,因为您正在比较两个不同字符串的两个不同指针。 如果此代码仍然有效,那么这是GCC大量优化的结果,它只保留一个副本以进行大小优化。
使用strcmp()
。 链接 。
如果比较两个比较,那就是比较这些字符串的基本地址而不是这些字符串中的实际字符。 比较字符串使用strcmp()
和strcasecmp()
库函数或写这样的程序。 下面不是完整的代码,只是字符串比较所需的逻辑。
void mystrcmp(const char *source,char *dest)
{
for(i=0;source[i] != '\0';i++)
dest[i] = source[i];
dest[i] = 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.