为什么我的 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 添加到参数后)。