【问题标题】:Why does my version of strcmp not work?为什么我的 strcmp 版本不起作用?
【发布时间】:2016-02-08 06:10:45
【问题描述】:

我有一个自己的 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 是什么?

标签: c++ arrays string strcmp


【解决方案1】:

您的数组未初始化,只更改了每个数组的第一个元素。这意味着,不是将字符串“f”和“f”相互比较,而是将两个 20 字节的块相互比较,除了每个块都以“f”开头。 (实际上,由于这些数组不是以空值结尾的,因此您正在比较两个随机的内存区域!)

尝试更改您的测试用例,以便使用strcpy 来初始化数组。这应该可以解决您的问题。

【讨论】:

  • 哇,我明白问题出在哪里了。我假设首先声明一个 char 会用空终止符填充所有未使用的空格。
  • @user3328187 您可以通过编写char arr[size] = {0}; 来初始化char 数组,使其中只有空终止符,以防万一。
【解决方案2】:

您的测试用例已损坏,您缺少 NUL 终止符,因此您正在比较两个以 f 开头的字符串,然后继续处理堆栈中的任何垃圾。

您可以通过显式添加终止符来修复它,例如:

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

或直接用相关的字符串字面量初始化它们:

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

或者通过使用 strcpy,或者直接比较两个字符串字面量

strcmp("f", "f") 

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 2016-05-09
    相关资源
    最近更新 更多