C中字符串的比较

时间:2016-03-31 00:14:55

标签: c string

char str1[]="abc";
char str2[]="abc";

if (str1==str2)
    printf("Yes")
else
    printf("No");

我正在刷新我的C.不会上面的代码返回"是"?我认为这是因为str1和str2指向数组的第一个元素,它们是相同的(字母a)。请告知我是否遗漏了什么。

2 个答案:

答案 0 :(得分:0)

char数组的变量名等效于指向数组第一个元素地址的指针。因此,你所比较的是指针。它们不等价,因为内存中两个变量的地址不相等。

答案 1 :(得分:0)

从技术上讲,您正在比较字符串地址。因此,如果没有优化,预期的答案是“否”(两个不同的字符串,因此是两个地址)。

但是,大多数现代编译器都执行字符串实习(合并相同的常量字符串),在这种情况下答案是“是”。请注意,这仅适用于字符串文字。

例如,GCC 4.9.2默认执行此操作:

#include <stdio.h>
int
main()
{
    char *ptr1 = "abc";
    char *ptr2 = "abc";
    printf("%p\n%p\n",ptr1,ptr2);
    if (ptr1 == ptr2) printf("yes\n");
}

gcc -o /tmp/file /tmp/file.c

/tmp/file
0x400660
0x400660
yes

有趣的是,在声明变量char ptr1[]char ptr2[]时,行为是不同的(即没有实习)。这是因为,在这种情况下,编译器实际上将字符串放在堆栈上(参见here)。

如评论中所述,比较字符串的正确方法是strcmp和相关函数。