C字符串与等号的比较

时间:2013-07-22 07:13:43

标签: c string c-strings

我有这段代码:

char *name = "George"

if(name == "George")
   printf("It's George")

我认为c字符串无法与==符号进行比较,我必须使用strcmp。由于未知原因,当我使用gcc(版本4.7.3)编译时,此代码有效。我认为这是错误的,因为它就像比较指针,所以我在谷歌搜索,很多人说这是错误的,与==比较是无法做到的。那么为什么这种比较方法有效?

5 个答案:

答案 0 :(得分:27)

  

我认为c字符串无法与==符号进行比较,我必须使用strcmp

右。

  

我认为这是错误的,因为它就像比较指针,所以我在谷歌搜索,很多人说这是错误的,与==比较无法完成

那也是对的。

  

那么为什么这种比较方法有效?

它“不起作用”。只有似乎正在运作。

发生这种情况的原因可能是编译器优化:两个字符串文字是相同的,因此编译器实际上只生成它们的一个实例,并且只要引用字符串文字就使用相同的指针/数组。

答案 1 :(得分:9)

仅提供@ H2CO3答案的参考:

C11 6.4.5 字符串文字

  

如果这些数组的元素具有不同的数据,则未指定   适当的价值观如果程序试图修改这样的数组,则行为是   未定义。

这意味着在您的示例中,name(字符串文字“George”)和"George"可能也可能不共享相同的位置,这取决于实现。所以不要指望这一点,它可能会在其他机器上产生不同的结果。

答案 2 :(得分:5)

您所做的比较会比较两个字符串的位置,而不是它们的内容。只是碰巧你的编译器决定只创建包含字符"George"一个字符串文字。这意味着存储在name中的字符串的位置和第二个"George"的位置是相同的,因此比较返回非零。

然而,编译器不需要执行此操作 - 它可以轻松地创建两个不同的字符串文字,具有不同的位置但内容相同,然后比较将返回零。

答案 3 :(得分:0)

这将失败,因为您正在比较两个不同字符串的两个不同指针。 如果此代码仍然有效,那么这是GCC大量优化的结果,只保留一个副本以进行大小优化。

使用strcmp()Link

答案 4 :(得分:-1)

如果你比较两个比较你正在比较那些字符串的基地址而不是那些字符串中的实际字符。用于比较字符串使用strcmp()strcasecmp()库函数或编写这样的程序。下面不是完整的代码,只是字符串比较所需的逻辑。

void mystrcmp(const char *source,char *dest)
{
    for(i=0;source[i] != '\0';i++)
        dest[i] = source[i];
   dest[i] = 0;

}