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

C语言写文件时出现段错误及文件名异常问题求助

问题修复方案

一、段错误问题分析与修复

你推测的fgetc返回值类型问题确实是核心原因之一,同时代码里还有其他直接触发段错误的逻辑漏洞:

  1. fgetc返回int类型(覆盖0~255的字符值和EOF(-1)),如果用有符号char存储,EOF会被截断为无效值,导致feof判断失效;
  2. 当pIn为NULL(文件未找到)时,函数没有终止,后续依然执行fclose(pIn),直接对空指针操作触发段错误;
  3. 循环逻辑顺序错误:先处理字符再判断文件结束,会导致EOF被错误传入tolower和putchar,同时最后一个有效字符会被重复处理。

修复后的完整代码:

void TraverseFile(char *inFile, char *outFile)
{
    FILE *pIn = fopen(inFile, "r");
    if (pIn == NULL)
    {
        printf("File not found\n");
        return; // 文件未找到直接返回,避免后续非法操作
    }

    FILE *pOut = fopen(outFile, "w");
    if (pOut == NULL)
    {
        printf("The write file cannot be opened.\n");
        fclose(pIn);
        exit(1);
    }

    int c; // 用int存储fgetc返回值,兼容EOF
    while ((c = fgetc(pIn)) != EOF) // 直接判断是否到达文件末尾
    {
        c = tolower(c);
        putchar(c);
        fputc(c, pOut);
    }

    fclose(pOut);
    fclose(pIn);
}

二、输出文件名旁的奇怪点问题

从图片显示的现象来看,这个异常是输出文件名包含不可见控制字符导致的,常见原因:

  • 传入的outFile字符串未正确以\0结尾,出现内存乱码;
  • 用户输入文件名时带入了换行符、制表符等不可见字符;
  • 调用TraverseFile时,outFile参数被错误赋值(比如缓冲区溢出导致的乱码)。

解决方法:

  1. 检查调用函数时的outFile参数,确保是标准C字符串(以\0结尾,无多余不可见字符);
  2. 如果是从用户输入获取文件名,读取后要清除末尾换行符:
char outFile[256];
fgets(outFile, sizeof(outFile), stdin);
size_t len = strlen(outFile);
if (len > 0 && outFile[len-1] == '\n')
{
    outFile[len-1] = '\0';
}
  1. 可以在函数内打印文件名的十六进制值排查问题:
printf("输出文件名十六进制:");
for (int i=0; outFile[i]!='\0'; i++)
{
    printf("%02x ", (unsigned char)outFile[i]);
}
printf("\n");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:30:49