7

我有这个代码:

char *name = "George"

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

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

4

5 回答 5

28

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

对。

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

那也是对的。

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

它不“工作”。它似乎只是在工作。

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

于 2013-07-22T07:16:17.813 回答
10

只是为了提供对@H2CO3 答案的参考:

C11 6.4.5字符串文字

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

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

于 2013-07-22T07:33:54.957 回答
5

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

然而,编译器不需要这样做——它可以很容易地创建两个不同的字符串文字,具有不同的位置但相同的内容,然后比较将返回零。

于 2013-07-22T07:19:48.517 回答
1

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

使用strcmp(). 链接

于 2013-07-22T07:16:09.220 回答
-1

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

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

}
于 2013-07-22T07:57:27.087 回答