我写了一个替换函数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");
}
我哪里做错了?
答案 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,则返回它。