为何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
相关产品推荐
相关产品推荐

