为什么代码显示当一个字符串大于另一个字符串时字符串是相同的

时间:2017-01-21 17:03:24

标签: c string

我写了一个替换函数strcmp()的函数 案例是:

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

理论上:

  

' ' > ' B'/ EM>'

所以' 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");
}

我哪里做错了?

3 个答案:

答案 0 :(得分:2)

你的假设是假的:'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来比较字符串。

答案 1 :(得分:1)

首先你必须尝试处理这个问题,两个字符串的长度是否相等?如果不是你,必须以最低限度工作

请注意,您实现的cmp函数仅在字符串相等时才有效

这是您cmp功能的问题,当您知道一个字符串更大更少<时,您必须break for循环/ strong>比其他字符串,但您的代码继续检查剩余字符:

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

如果我是你,首先我假设字符串相等,那么如果String大于或小于其他字符串,我会尝试更改标志

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

答案 2 :(得分:0)

您的算法错误,当字符不是margin-top时,您应该返回字符之间的差异。因为如果最后一个字符相同,0会被覆盖,如果在字符串中包含尾随flag,则很容易发生这种情况。

请注意,最后我的意思是,最短字符串的最后一个字符与给定位置的较长字符串的字符相同。

一个快速解决方法是检查'\n'循环条件中的flag == 0,但您只需检查两个字符之间的差异是for并继续下一个字符或如果它不是0,则返回