C中的strcmp返回1而不是0

C中的strcmp返回1而不是0,c,string,comparison,string-comparison,strcmp,C,String,Comparison,String Comparison,Strcmp,我用C编写了以下代码 #include <stdio.h> #include <string.h> int main(void) { char str1[4] = "abcd"; char str2[4] = "abcd"; printf("%d\n",strcmp(str1,str2)); return 0; } 是虫子吗?还是我遗漏了什么?因为您的数组不够长。您没有考虑字符串的零终止符。字符串需要5个字符,字符串本身需要4个字符,零

我用C编写了以下代码

#include <stdio.h>
#include <string.h>
int main(void) {
    char str1[4] = "abcd";
    char str2[4] = "abcd";
    printf("%d\n",strcmp(str1,str2));

    return 0;
}

是虫子吗?还是我遗漏了什么?

因为您的数组不够长。您没有考虑字符串的零终止符。字符串需要5个字符,字符串本身需要4个字符,零终止符需要1个字符

写:

char str1[5] = "abcd";
char str2[5] = "abcd";

顺便说一句,我想知道为什么您的编译器没有发出警告或发出警告?

因为您的数组不够长。您没有考虑字符串的零终止符。字符串需要5个字符,字符串本身需要4个字符,零终止符需要1个字符

写:

char str1[5] = "abcd";
char str2[5] = "abcd";

顺便说一句,我想知道为什么编译器不发出警告或发出警告?

内存中的一个字符串如下所示:“a”“b”“c”“d”“\0”。也就是说,与每个字符串一样,它以“\0”结尾,后者是一个类似于“a”或“b”的字符。因此,您需要容纳五个字符的空间来存储字符串“abcd”,并且必须通过字符str1[5]来声明它。

内存中的一个字符串如下所示:“a”“b”“c”“d”“\0”。也就是说,与每个字符串一样,它以“\0”结尾,后者是一个类似于“a”或“b”的字符。因此,为了存储字符串“abcd”,您需要五个字符的空间,并且必须通过char str1[5]声明它。

要么为数组提供正确的大小,要么让编译器为您做所有事情

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

在这种情况下,编译器将为字符串提供足够的空间。

要么为数组提供正确的大小,要么让编译器为您执行所有操作

 char str1[] = "abcd";
 char str2[] = "abcd";
在这种情况下,编译器将为字符串提供足够的空间。

(由Pascal Cuoq提供)

C99标准§6.7.8.14规定

字符类型的数组可以由字符串初始化 文字,可以选择用大括号括起来。连续字符 字符串文字(包括终止的空字符,如果 存在空间或阵列大小未知时)初始化 数组的元素

由于字符串以空字节
'\0'
终止,字符串文本
“abcd”
中的实际字符数为
5
。数组
str1
str2
的大小为
4
。因此,它们不能保存空字节,实际上不是字符串。以下陈述是等效的

char str1[4] = "abcd";
char str1[4] = {"abcd"}
char str1[4] = {'a', 'b', 'c', 'd'};
str1
str2
传递到
strcmp
会调用未定义的行为,因为它们不是字符串
strcmp
将溢出由
str1
str2
指向的缓冲区,因为它找不到终止的空字节。这是未定义的行为,可能会由于segfault导致程序崩溃

字符串是以空字节
'\0'
终止的字符数组。因此,字符串literal
“abcd”
的长度是
5
,而不是
4
。请注意,标准库函数
strlen
不计算空字节,因此在本例中,
strlen(“abcd”)
返回
4

当您使用字符串文字初始化数组时,最好将数组大小留空,这将自动确定为足够大以存储初始化字符串文字中的所有字符

#include <stdio.h>
#include <string.h>

int main(void) {
    char str1[] = "abcd";
    char str2[] = "abcd";
    printf("%d\n", strcmp(str1, str2));  // prints 0

    return 0;
}
#包括
#包括
内部主(空){
字符str1[]=“abcd”;
字符str2[]=“abcd”;
printf(“%d\n”,strcmp(str1,str2));//打印0
返回0;
}
(帕斯卡·库克提供)

C99标准§6.7.8.14规定

字符类型的数组可以由字符串初始化 文字,可以选择用大括号括起来。连续字符 字符串文字(包括终止的空字符,如果 存在空间或阵列大小未知时)初始化 数组的元素

由于字符串以空字节
'\0'
终止,字符串文本
“abcd”
中的实际字符数为
5
。数组
str1
str2
的大小为
4
。因此,它们不能保存空字节,实际上不是字符串。以下陈述是等效的

char str1[4] = "abcd";
char str1[4] = {"abcd"}
char str1[4] = {'a', 'b', 'c', 'd'};
str1
str2
传递到
strcmp
会调用未定义的行为,因为它们不是字符串
strcmp
将溢出由
str1
str2
指向的缓冲区,因为它找不到终止的空字节。这是未定义的行为,可能会由于segfault导致程序崩溃

字符串是以空字节
'\0'
终止的字符数组。因此,字符串literal
“abcd”
的长度是
5
,而不是
4
。请注意,标准库函数
strlen
不计算空字节,因此在本例中,
strlen(“abcd”)
返回
4

当您使用字符串文字初始化数组时,最好将数组大小留空,这将自动确定为足够大以存储初始化字符串文字中的所有字符

#include <stdio.h>
#include <string.h>

int main(void) {
    char str1[] = "abcd";
    char str2[] = "abcd";
    printf("%d\n", strcmp(str1, str2));  // prints 0

    return 0;
}
#包括
#包括
内部主(空){
字符str1[]=“abcd”;
字符str2[]=“abcd”;
printf(“%d\n”,strcmp(str1,str2));//打印0
返回0;
}

确实如此。长度为4的数组的索引范围为0到3。尾随零需要空间,因此数组的长度需要为5。或者您可以编写
char str1[]=“abcd”并让编译器计算长度(5)。@Buttanivjay:C中没有“越界”异常。如果写入的索引超过最后一个索引,数组后的内存将被覆盖,然后可能发生任何事情。@shivamtiwari93终止
\0
。(很可能它只是将4个字符复制到数组中,而没有使用终止符,您正在比较两个未终止的字符,并且很可能重叠,