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

为何strcmp判定看似完全相同的两个字符串不相等?

Why does strcmp return non-zero for seemingly identical strings from fgets vs manually generated spaces?

我太懂这个坑了!核心问题出在**fgets会把换行符\n一起读进字符串里**,而你手动生成的rhs只有空格和终止符,两者实际内容根本不一样!

咱们掰碎了说:

  • 你的rhs是用memset填了n-1个空格,再加\0终止,所以实际内容是9个空格加结束符,也就是" "(视觉上的9个空格)。
  • 当用fgets读取文件时,如果你的test文件里那一行是9个空格并且结尾有换行(这是文本文件的常态),fgets会把这个换行符\n也塞进lhs里。这时候lhs的真实内容是" \n"——9个空格加一个换行,再加结束符。

gdb打印的时候不会显示换行符,所以看起来俩字符串一模一样,但strcmp是逐字节对比的,到换行符那个位置就会发现差异,自然返回非零。

怎么验证?

你可以在代码里加一行打印lhs的长度:

printf("lhs length: %zu\n", strlen(lhs));

如果输出是10而不是9,那实锤就是多了个换行符。

解决办法

读取完成后手动去掉换行符就行:

fgets(lhs, sizeof(lhs), file);
// 检查并移除换行符
size_t lhs_len = strlen(lhs);
if (lhs_len > 0 && lhs[lhs_len - 1] == '\n') {
    lhs[lhs_len - 1] = '\0';
}

这样处理后,lhs就和rhs完全一致了,strcmp会返回预期的0。

另外补充一句:如果文件里的行长度超过了缓冲区大小n-1,fgets不会读入换行符,上面的判断也能避免数组越界的问题,很安全。

内容的提问来源于stack exchange,提问作者karafar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:52:27