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

为何这段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无效打印的问题:

  1. 函数开头读取的c1和c2,进入循环后立刻被重新读取覆盖,导致这两个初始字符完全跳过对比和打印。
  2. 循环内是「先读字符→比较→打印」的顺序,当文件读到末尾时,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:52:37