我有一个我自己的strcmp版本,看起来像这样
int strcmp(char str1[], char str2[])
{
int i = 0;
while ((str1[i] == str2[i]) && (str1[i] != '\0'))
{
i++;
}
if (str1[i] > str2[i])
return 1;
if (str1[i] < str2[i])
return -1;
return 0;
}
我的测试用例是
char a[20];
char b[20];
b[0] = 'f';
a[0] = 'f';
cout << strcmp(b, a) << endl;
但是,我输出1,意味着它们彼此不相等。如果我在函数调用中交换a和b的位置,我得-1。当我的char都是'f'时,我不确定为什么我无法在比较中得到0返回。我觉得这是如此基本,我不知道为什么我的比较结束
str1[i] > str2[i]
答案 0 :(得分:8)
您已将数组保持未初始化状态,只更改了每个数组的第一个元素。这意味着不是将字符串“f”和“f”相互比较,而是将两个20字节的块相互比较,除了每个块以“f”开头。 (实际上,由于这些数组不是以空值终止的,所以你要将两个随机内存区域进行比较!)
尝试更改测试用例,以便使用strcpy
初始化数组。这应该可以解决你的问题。
答案 1 :(得分:3)
您的测试用例已损坏,您缺少NUL终结符,因此您要比较以f
开头的两个字符串,并继续处理堆栈中的任何垃圾。
您可以通过显式添加终结符来修复它,例如:
a[1]=b[1]=0;
或使用相关的字符串文字直接初始化它们:
char a[20]="f";
char b[20]="f";
或使用strcpy,或直接比较两个字符串文字
strcmp("f", "f")
(将const
添加到参数后)。