繁体   English   中英

C字符串与等号的比较

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM