我有这个代码:
char *name = "George"
if(name == "George")
printf("It's George")
我认为 c 字符串无法与==
sign 进行比较,我必须使用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;
}