c - 当一个字符串大于另一个时,为什么代码显示字符串相同

标签 c string

我写了一个函数来替换 strcmp() 函数。
这些案例是:

1) 字符串相同
2) 第二个字符串将在字典中排在第一位。
3) 第一个字符串将在字典中排在第一位。

理论上:

'a' > 'b'

所以 'a' 是第一个出现在字典中的字符串,但是,我的代码并没有完全像这样查看它,而是像情况 1 一样对待它。

这是我的代码:

int cmp(char fString[], char sString[])
{
    int flag = 0;
    int i = 0;

    for (i = 0; fString[i]; i++) {
        if (fString[i] == sString[i]) {
            flag = 0;
        } else
        if (fString[i] > sString[i]) {
            flag = 1;
        } else {
            flag = -1;
        }
    }
    return flag;
}

条件是:

if (cmp(fString, sString) == 0) {
    printf("Strings are the same.\n");
} else
if (cmp(fString, sString) > 0) {
    printf("First string will come first in the dictionary\n");
} else {
    printf("Second string will come first in the dictionary\n");
}

我哪里做错了?

最佳答案

您的假设是错误的:'a' > 'b' 应该改为阅读

'a' < 'b'

如果你坚持写一个返回1的函数如果第一个字符串参数应该出现在第二个参数之前,你至少应该实现正确的算法:

  • 当你遇到不同的字符时,你必须停止迭代。您目前一直循环并覆盖 flag下一个字符的值。
  • 你必须处理第一个字符串比第二个短的情况,你目前返回0 ,这是不正确的。

这是更正后的版本:

int cmp(char fString[], char sString[]) {
    int i = 0;

    for (i = 0; fString[i]; i++) {
        if (fString[i] == sString[i]) {
            continue;
        } else
        if (fString[i] > sString[i]) {
            return 1;
        } else {
            return -1;
        }
    }
    if (sString[i])
        return 1;  // fString is shorter, it should come first 
    else
        return 0;  // strings are the same
}

但是请注意,使用违反直觉的约定非常令人困惑。字符串比较函数应返回 < 0它的第一个参数在概念上小于第二个参数,并且应该在按递增顺序排序的列表中排在第一位。

另请注意 strcmp()函数根据类型 unsigned char 的顺序比较字符串而不是 char .

关于c - 当一个字符串大于另一个时,为什么代码显示字符串相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41782089/

相关文章:

c++ 没有匹配的构造函数?

C 内存缓冲区破坏微 Controller 内存分配 - Atmel ATxmega

c语言中计算一个值出现的频率

c# - 如何通过保留空格对包含空格的字符串中的字符进行排序

javascript - 在 Javascript 或 jQuery 中,如何检测字符串开头的空格?

python加入 "large"文件

c - strtok 不会接受 : char *str

c - Linux,读取磁带设备

c - 仅使用 Win32 将 HBITMAP 保存为 *.bmp 文件

python - 从动词列表中检索动词