c - 如何修复 C 编程中的分段错误?
问题描述
我想让用户输入打开一个 txt 文件,但我收到了这个编译错误。[1] 85501 segmentation fault
有人可以帮我弄这个吗?样本输入2021-10-17
这是 git repo https://github.com/anjula-sack/diary
void DecryptEntry()
{
FILE *fptr;
char filename[20];
printf("Please enter the date of the entry you want to read, ex:2021-10-17\n");
fscanf(stdin, " ");
fgets(filename, 20, stdin);
strcpy(filename, ".txt");
printf("%s.txt", filename);
if ((fptr = fopen(filename, "r")) == NULL)
{
printf("Error! the entry doesn't exist");
}
}
解决方案
查看来自您的 github 链接的实际代码,然后您将拥有:
strcpy(filename, ".txt");
if ((fptr = fopen(filename, "r")) == NULL)
{
printf("Error! the entry doesn't exist");
}
fgets(message, 100, fptr);
首先,这strcpy
是无稽之谈,因为它会覆盖文件名并将其替换为".txt"
. 由于这永远不是有效的文件名,fopen
因此总是会失败。而当它失败时,你会打印一条错误消息但继续执行,所以下一次fgets
调用将导致崩溃。
通过为文件名分配足够的空间,用(附加)替换strcpy
(覆盖)并在无法打开文件时执行等来解决此问题。strcat
return
通过使用调试器单步执行函数,您可以很容易地自己发现这些错误。
推荐阅读
- reactjs - 从 API Fetch & Map React 显示数据
- python - 如何在涉及matrix_power的matplotlib中绘制矩阵的标量函数?
- javascript - 如何将JS得到的值代入CSS中的特定位置?
- javascript - 无法使用 ASP.NET MVC 和实体框架呈现 CanvasJS 图表
- c - C 冒泡排序整数数组 - 输出问题
- java - 使用 Spring Boot 使 Ehcache TTL 超时可配置
- node.js - 使用 subString 在 node.js 中出现错误
- c# - CarouselView xamarin 表单冲突 Xamarin 表单错误
- c - 我应该如何定义/声明字符串常量
- r - 表示泊松点过程模型中需要空间依赖/交互项的非齐次 K 函数