C语言字符串比较函数为何在两字符串相同时返回-1?
问题分析与修复:字符串比较函数返回值错误
核心问题:混淆了字符串结束符与EOF
C语言中,字符串是以空字符'\0'(ASCII值为0)作为结束标志的,而EOF是用于文件输入输出操作的宏,代表文件结束,其值通常为-1,两者完全不是同一个概念。
你的代码中所有判断字符串结束的地方都误用了EOF,这会导致:
- 循环无法在字符串正常末尾停止,会继续访问内存中字符串之后的未知区域,直到碰到值为
-1的字节才退出循环 - 当两个字符串内容完全相同时,循环退出后会因为后续内存字节的随机值触发错误的返回分支,导致返回
-1而非预期的0
修复后的代码
将所有EOF替换为'\0'即可解决问题,同时可以简化嵌套的else结构让代码更易读:
int testString(char* a, char* b){ int i = 0; while(a[i] != '\0' && b[i] != '\0'){ if(a[i] > b[i]){ return 1; } else if(a[i] < b[i]){ return -1; } else{ i++; } } if(a[i] == '\0' && b[i] != '\0'){ return -1; } else if(a[i] != '\0' && b[i] == '\0'){ return 1; } else{ return 0; } }
为什么排序看起来有效?
快速排序只要求比较函数满足严格弱序,你的错误函数在多数字符串内容不同的场景下,碰巧返回了正确的相对顺序,因此排序结果看起来正常,但它的逻辑本质是错误的,尤其是相同字符串的比较结果不符合预期,直接导致排序验证失败。
内容的提问来源于stack exchange,提问作者Ugo Flickerman
相关产品推荐
相关产品推荐

