当两个输入字符串相同时,为什么这个char*比较函数返回-1 ?语言:C.



我做了一个函数,应该帮助我按字母顺序排序字符串:如果第一个字符串在第二个字符串之前,它应该返回-1,如果它们是相同的字符串,如果第一个字符串在第二个字符串之后,它应该返回1。这是代码:

int testString(char* a, char* b){
int i = 0;

while(a[i] != EOF && b[i] != EOF){
if(a[i] > b[i]){
return 1;
}
else{
if(a[i] < b[i]){
return -1;
}
else{
i++;
}
}
}

if(a[i] == EOF && b[i]!=EOF){
return -1;
}
else{
if(a[i] != EOF && b[i] == EOF){
return 1;
}
else{
if(a[i] == EOF && b[i] == EOF){
return 0;
}
else{
printf("Problem in the string comparisonn");
return -2;
}
}
}
}

So:只要字符串中存在字符,它就会执行while循环,如果一个字符串与另一个字符串相同,但更长,则在完全相反的情况下返回1,-1,如果它们非常相同,则返回0,因此长度相同。虽然,这返回-1与相同的字符串,我不明白为什么。

我试着用它来排序一个结构数组,其中一个元素是char*类型的,它确实工作(因为排序算法是一个快速排序,我做的一个不做小于等于之间的区别,在排序期间)。后来我打印出了struct数组的字符串,它们确实是有序的。问题是,测试(使用相同的函数)来查看它们是否有序,告诉我它们不是,因为它返回-1而不是0,当字符串相同时,因此不尊重反字母顺序。现在我看了看这个函数,但它看起来很好,我不知道它出了什么问题

来自C标准(7.21 Input/output)

EOF扩展为整型常量表达式,类型为int和,它由几个函数返回给指示文件结束,即不再有来自流的输入;

通常这个宏扩展为-1

但是你需要比较字符串。字符串是以终止零字符''

结尾的字符序列。那么这个while loop

while(a[i] != EOF && b[i] != EOF){

可以调用未定义的行为。

还有else语句

else{
printf("Problem in the string comparisonn");
return -2;
}

永远不会得到控制。所以这是多余的。

并引入int型变量i

int i = 0;

也是多余的。

你的函数可以如下所示

int testString( const char *a, const char *b )
{
while ( *a != '' && *a == *b )
{
++a;
++b;
}
return ( *( unsigned char * )b < *( unsigned char * )a ) - 
( *( unsigned char * )a < *( unsigned char * )b );
}
while(a[i] != EOF && b[i] != EOF){

字符串终止符是0,不是EOF。将其改为

while (a[i] != 0 && b[i] != 0 )

还是

while (a[i] && b[i])

在剩余的代码中,将a[i]b[i]EOF进行比较,请执行相同的操作。

没有这样的EOF字符——EOF是输入函数在检测到流的文件结束条件时返回的值。

最新更新