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

时间:2016-01-22 10:19:43

标签: c string strcmp

#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
     比较值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
     比较值-175

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

4 个答案:

答案 0 :(得分:4)

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

strcmpchar a[10]="1234567890";时,strcmp所依赖的空终结符没有空间。这会导致strncmp超出阵列。

一种补救措施是使用char a[]="1234567890";

另一个是使用b(同样调整public class SettingsFragment extends PreferenceFragmentCompat implements PreferenceFragmentCompat.OnPreferenceStartScreenCallback { public static SettingsFragment newInstance() { return new SettingsFragment(); } @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.news_settings); } @Override public Fragment getCallbackFragment() { return this; } @Override public boolean onPreferenceStartScreen(PreferenceFragmentCompat preferenceFragmentCompat, PreferenceScreen preferenceScreen) { preferenceFragmentCompat.setPreferenceScreen(preferenceScreen); return true; } } )并让编译器计算出数组长度,在本例中为11。

答案 1 :(得分:1)

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

  

1 Astring是一个由AND连接的连续字符序列   包括第一个空字符....字符串的长度是   空字符前面的字节数和字符串的值   是按顺序包含的字符值的序列。

根据功能strcmp

的描述
  

2 strcmp函数将s1指向的字符串与之比较    s2指向的字符串

根据6.7.9标准的初始化

  

14字符串数组可以用字符串初始化   文字或UTF-8字符串文字,可选择用大括号括起来。   字符串文字的连续字节(包括终止   空字符如果有空间或数组的大小未知)   初始化数组的元素。

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

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

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

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

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

因此数组不包含字符串,函数strcmp可能不会应用于数组。否则它将具有未定义的行为,因为当它在数组之外找到不相等的字符(因为数组具有所有相等的字符)或终止零时它将停止。

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

它的调用可以通过以下方式查找

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

答案 2 :(得分:0)

使用字符串文字(但nul termiantor 没有空格)声明和初始化数组,并且字符串操作函数需要将C样式字符串作为参数传递(以'\0'终止)。

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

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

'\0'字符没有空格,因此会调用未定义的行为。

增加数组的大小 -

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

答案 3 :(得分:0)

在你的第二个案例中,

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

您的数组不是以空值终止的,因此它们不能用作字符串。在字符串系列上运行的任何函数都将调用undefined behavior,(因为它们将超过分配的内存< em>搜索 null-terminator)。

你最好使用

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

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

尽管如此,void main()至少应符合标准{。}}。