我做了一个函数,应该帮助我按字母顺序排序字符串:如果第一个字符串在第二个字符串之前,它应该返回-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
是输入函数在检测到流的文件结束条件时返回的值。