我写了一个函数来替换 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/