为什么 strcmp 对完整的填充字符数组给出不同的响应?

Why strcmp giving different response for complete filled character array?

#include <stdio.h>
#include <string.h>
void main()
{
  char a[10]="123456789";
  char b[10]="123456789";
  int d;
  d=strcmp(a,b);

  printf("\nstrcmp(a,b) %d", (strcmp(a,b)==0) ? 0:1);
  printf("compare Value %d",d);
}

输出:

strcmp(a,b) 0
compare value 0

如果相同的程序在将数组增加到完整值时响应不同,我的意思是 10 个字符。那个时候值不一样。

#include <stdio.h>
#include <string.h>
void main()
{
  char a[10]="1234567890";
  char b[10]="1234567890";
  int d;
  d=strcmp(a,b);

  printf("\nstrcmp(a,b) %d", (strcmp(a,b)==0) ? 0:1);
  printf("compare Value %d",d);
}

输出:

strcmp(a,b) 1
compare value -175

为什么 strcmp 当字符串达到数组的完整值时响应不同?

您的第二个代码段的行为未定义。

当您写 char a[10]="1234567890"; 时,strcmp 所依赖的 null-terminator 没有空间。这会导致 strcmp 溢出数组。

一种补救方法是使用 strncmp.

另一种方法是使用 char a[]="1234567890";b 进行类似调整)并让编译器计算出数组长度,在本例中为 11。

您使用字符串文字声明并初始化数组(但没有 space for nul termiantor)并且字符串操作函数需要 C-style 字符串作为参数传递(以 '[=12=]' 结尾)。

所以,在你的第二个程序中你的数组 -

char a[10]="1234567890";
char b[10]="1234567890";

'[=12=]' 字符没有 space,因此这会调用未定义的行为。

增加数组的大小 -

char a[11]="1234567890";          //or char a[]="1234567890"; 

在你的第二种情况下,

char a[10]="1234567890";
char b[10]="1234567890";

您的数组不是 null-terminated,因此它们不能用作 字符串。 任何对字符串系列进行操作的函数都将调用 undefined behavior,(因为它们将越过分配的内存 搜索 null-terminator).

你最好使用

char a[ ]="1234567890";
char b[ ]="1234567890";

将大小分配留给编译器以避免 null-termination 问题。编译器将分配足够的内存来保存提供的初始化程序以及终止 null。

也就是说,void main()至少应该int main(void)符合标准。

根据C标准中使用的术语定义(7.1.1术语定义)

1 Astring is a contiguous sequence of characters terminated by and including the first null character....The length of a string is the number of bytes preceding the null character and the value of a string is the sequence of the values of the contained characters, in order.

根据函数描述strcmp

2 The strcmp function compares the string pointed to by s1 to the string pointed to by s2.

根据标准的 6.7.9 初始化部分

14 An array of character type may be initialized by a character string literal or UTF−8 string literal, optionally enclosed in braces. Successive bytes of the string literal (including the terminating null character if there is room or if the array is of unknown size) initialize the elements of the array.

在第一个程序中,由字符串文字初始化的数组 ab 有空间存储终止零。

char a[10]="123456789";
char b[10]="123456789";

因此数组包含 string 并且函数 strcmp 可以应用于这些数组。

在第二个程序中数组ab没有空间来存储终止零

char a[10]="1234567890";
char b[10]="1234567890";

因此数组不包含字符串,函数 strcmp 可能不适用于数组。否则它将有未定义的行为,因为它会在发现数组之外的 non-equal 个字符(因为数组具有所有相同的字符)或终止零时停止。

如果限制与数组大小的比较,您可以获得有效结果。为此,您必须使用另一个标准函数 strncmp

它的调用可以像下面这样看

strncmp( a, b, sizeof( a ) );