为什么我的strcmp版本不起作用?

时间:2016-02-08 06:10:45

标签: c++ arrays string strcmp

我有一个我自己的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] 

2 个答案:

答案 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添加到参数后)。

相关问题