#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
在字符串达到数组的完整值时会有不同的响应?
答案 0 :(得分:4)
您的第二个代码段的行为未定义。
当strcmp
写char 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字符串文字,可选择用大括号括起来。 字符串文字的连续字节(包括终止 空字符如果有空间或数组的大小未知) 初始化数组的元素。
在第一个程序中,由字符串文字初始化的数组a
和b
有空间来存储终止零。
char a[10]="123456789";
char b[10]="123456789";
因此,数组包含string
,函数strcmp
可以应用于这些数组。
在第二个程序中,数组a
和b
没有空间来存储终止零
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()
至少应符合标准{。}}。