如何修复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
相关产品推荐
相关产品推荐

