我有这段代码:
char *name = "George"
if(name == "George")
printf("It's George")
我曾认为c字符串不能用==
符号进行比较,而是必须使用strcmp
函数。但不知何故,在使用gcc(版本4.7.3)编译时,这段代码可以正常工作。我认为这是错误的,因为它就像比较指针一样,所以我在谷歌上搜索了很多人都说这是错误的,不能用==
进行比较。那么为什么这种比较方法可以正常工作呢?
没错。
我认为这是错误的,因为这就像比较指针一样,所以我在谷歌上搜索了很多人都说这是错误的,不能用==进行比较。
也没错。
那么为什么这种比较方法有效呢?
它并不“有效”。它只是看起来“有效”而已。
这种情况发生的原因可能是编译器优化:两个字符串字面值相同,因此编译器实际上只生成一个实例,并且在引用字符串字面值时始终使用同一个指针/数组。
仅提供参考,以下是 @H2CO3 的回答:
C11 6.4.5 字符串字面量
未指定这些数组是否不同,只要它们的元素具有适当的值即可。如果程序尝试修改此类数组,则行为是未定义的。
这意味着在您的示例中,name
(一个字符串字面量 "George")和 "George"
可能共享同一位置,也可能不共享,这取决于实现。因此不要指望这一点,在其他机器上可能会产生不同的结果。
"George"
的字符串字面量。这意味着存储在name
中的字符串和第二个"George"
的位置相同,因此比较返回非零值。strcmp()
。这不是一个答案,也是错误的,因为“你正在比较两个不同指针所指的两个单独的字符串”是不正确的 - 就像我在我的答案中解释的那样。 - user529758如果您比较两个字符串,那么您比较的是这些字符串的基地址而不是其中的实际字符。要比较字符串,请使用strcmp()
和strcasecmp()
库函数或编写类似于以下代码的程序。下面的代码只是字符串比较所需的逻辑部分,不是完整代码。
void mystrcmp(const char *source,char *dest)
{
for(i=0;source[i] != '\0';i++)
dest[i] = source[i];
dest[i] = 0;
}
mtystrcpy
。 - alex01011
strcmp()
函数时,你正在比较地址。 - Grijesh Chauhan