为什么我的 strcmp 版本不能工作?

4
我有自己的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。我不确定为什么当我的字符都是'f'时,我无法获得0的返回值。我觉得这很基础,但不知道为什么我的比较有误。

str1[i] > str2[i] 

你认为索引1到19中包含了什么? - user253751
2个回答

8
您没有初始化数组,只改变了每个数组的第一个元素。这意味着您比较的不是字符串"f"和"f",而是两个块,每个块有20字节,但是每个块都以"f"开头。(实际上,由于这些数组没有以null结尾,您正在将两个随机内存区域进行比较!)
请尝试更改测试用例,使用strcpy初始化数组。这应该可以解决您的问题。

哇,我看到问题所在了。起初我假设声明字符会用 null 终止符填充所有未使用的空间。 - user3328187
1
@user3328187 如果需要的话,你可以通过编写 char arr[size] = {0}; 来初始化一个仅包含空终止符的 char 数组。 - templatetypedef

3

您的测试用例出现问题,缺少NUL终止符,因此您正在比较以f开头并带有堆栈上任何垃圾的两个字符串。

您可以通过显式添加终止符来解决此问题,例如:

a[1]=b[1]=0;

或者直接使用相关的字符串文字来初始化它们:

char a[20]="f";
char b[20]="f";

或者使用strcpy,或直接比较两个字符串字面值。

strcmp("f", "f") 

(一旦您将const添加到参数中)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接