You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 00:25:30