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

如何修复C语言读取用户输入打开txt文件时出现的segmentation fault错误

段错误问题修复方案

你的代码存在三处核心错误,直接触发段错误以及文件打开失败:

  • 字符串操作逻辑错误:你使用strcpy(filename, ".txt")会直接覆盖用户输入的日期内容,最终filename的值只有.txt,完全不符合预期。此处需要用字符串拼接函数strcat,将.txt后缀追加到输入的日期后面。
  • 未处理fgets读取的换行符:fgets读取用户输入时,会将你按下回车产生的换行符\n一并存入filename数组,不处理的话最终拼接出的文件名会自带换行符,系统无法识别对应文件,导致fopen返回空指针。
  • 空指针无防护:当fopen返回NULL时,你的代码仅打印错误提示,没有终止函数执行,如果后续代码有读写fptr的逻辑,就会直接访问空指针触发段错误。

修正后的完整代码如下:

#include <string.h> // 需引入该头文件使用字符串操作函数
void DecryptEntry()
{
  FILE *fptr;
  char filename[20];
  char *newline_pos;

  printf("Please enter the date of the entry you want to read, ex:2021-10-17\n");
  fscanf(stdin, " ");
  fgets(filename, 20, stdin);

  // 移除fgets读取到的末尾换行符
  if ((newline_pos = strchr(filename, '\n')) != NULL) {
    *newline_pos = '\0';
  }

  // 拼接.txt后缀,不要用strcpy覆盖原有内容
  strcat(filename, ".txt");
  printf("%s", filename);

  if ((fptr = fopen(filename, "r")) == NULL)
  {
    printf("Error! the entry doesn't exist");
    // 打开失败直接返回,避免后续操作空指针
    return;
  }

  // 后续正常读写fptr的逻辑
  // ...
  // 读写完成后记得调用fclose(fptr)释放资源
}

内容的提问来源于stack exchange,提问作者A.S. SAMARASINGHE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:09:01