为何这段C语言代码会输出空字符且在两个文件中均检测到空字符?
文件对比代码输出空字符的原因分析
核心问题1:错误用char存储fgetc的返回值
fgetc的返回值是**int类型**——它需要覆盖所有ASCII字符(0~255),还要返回特殊标记EOF(通常定义为-1)。如果用char存储:
- 若系统使用有符号
char,当读取到ASCII值为0xFF的扩展字符时,会被解析为-1,和EOF混淆,导致循环提前终止或误判字符。 - 当读取到文件末尾(返回
EOF)时,int型的-1存入char变量会变成0xFF,用printf("%c")输出时,这个字符是不可打印的控制字符,视觉上就表现为“空字符”。
正确定义应为:
int c1 = fgetc(file1); int c2 = fgetc(file2);
核心问题2:循环逻辑顺序错误
你的代码存在字符丢失+EOF无效打印的问题:
- 函数开头读取的
c1和c2,进入循环后立刻被重新读取覆盖,导致这两个初始字符完全跳过对比和打印。 - 循环内是「先读字符→比较→打印」的顺序,当文件读到末尾时,
fgetc返回EOF,此时c1和c2是EOF(对应char的0xFF),你依然用printf("%c")输出,自然会出现不可打印的空字符。
修正后的循环逻辑应该是「先处理当前字符→再读下一个」:
int c1 = fgetc(file1); int c2 = fgetc(file2); while (c1 != EOF && c2 != EOF) { printf("%c %c\n", c1, c2); // 先打印有效字符 if (c1 != c2) // 再对比 return false; c1 = fgetc(file1); // 最后读取下一个字符 c2 = fgetc(file2); }
完整修正后的代码
#include <stdio.h> #include <stdbool.h> bool isIdentical(FILE *file1, FILE *file2) { int c1 = fgetc(file1); int c2 = fgetc(file2); while (c1 != EOF && c2 != EOF) { printf("%c %c\n", c1, c2); if (c1 != c2) return false; c1 = fgetc(file1); c2 = fgetc(file2); } return (c1 == EOF && c2 == EOF); }
内容的提问来源于stack exchange,提问作者mazen mohamed
相关产品推荐
相关产品推荐

