为什么我的 strcmp 版本不起作用?
Why does my version of strcmp not work?
我有自己的 strcmp 版本,如下所示
int strcmp(char str1[], char str2[])
{
int i = 0;
while ((str1[i] == str2[i]) && (str1[i] != '[=10=]'))
{
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。我不确定为什么当我的字符都是 'f' 时我无法在比较中得到 0 return。我觉得这很基本,我不知道为什么我的比较不对
str1[i] > str2[i]
您没有初始化数组,只更改了每个数组的第一个元素。这意味着您不是将字符串 "f" 和 "f" 相互比较,而是将两个 20 字节的块相互比较,除了每个块都以 "f". (实际上,由于这些数组不是以 null 结尾的,所以您是在比较内存的两个随机区域!)
尝试更改测试用例,以便使用 strcpy
初始化数组。那应该可以解决您的问题。
您的测试用例已损坏,缺少 NUL 终止符,因此您正在比较两个以 f
开头并继续处理堆栈中垃圾的字符串。
您可以通过显式添加终止符来修复它,例如:
a[1]=b[1]=0;
或者直接用相关的字符串文字初始化它们:
char a[20]="f";
char b[20]="f";
或者通过使用 strcpy,或者直接比较两个字符串文字
strcmp("f", "f")
(将 const
添加到参数后)。
我有自己的 strcmp 版本,如下所示
int strcmp(char str1[], char str2[])
{
int i = 0;
while ((str1[i] == str2[i]) && (str1[i] != '[=10=]'))
{
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。我不确定为什么当我的字符都是 'f' 时我无法在比较中得到 0 return。我觉得这很基本,我不知道为什么我的比较不对
str1[i] > str2[i]
您没有初始化数组,只更改了每个数组的第一个元素。这意味着您不是将字符串 "f" 和 "f" 相互比较,而是将两个 20 字节的块相互比较,除了每个块都以 "f". (实际上,由于这些数组不是以 null 结尾的,所以您是在比较内存的两个随机区域!)
尝试更改测试用例,以便使用 strcpy
初始化数组。那应该可以解决您的问题。
您的测试用例已损坏,缺少 NUL 终止符,因此您正在比较两个以 f
开头并继续处理堆栈中垃圾的字符串。
您可以通过显式添加终止符来修复它,例如:
a[1]=b[1]=0;
或者直接用相关的字符串文字初始化它们:
char a[20]="f";
char b[20]="f";
或者通过使用 strcpy,或者直接比较两个字符串文字
strcmp("f", "f")
(将 const
添加到参数后)。