C语言程序异常退出求助:输入一行回车后程序终止
嘿,我来帮你排查下这个程序的问题!你遇到的程序一输入就终止,核心原因是未初始化的指针导致的内存访问错误,咱们一步步拆解:
问题1:未初始化的line指针
你定义了char *line;但没给它分配任何内存空间,fgets需要一个有效的内存地址来存储输入内容,直接用这个空指针会导致程序访问非法内存,触发崩溃直接退出。
解决办法很简单:把line改成固定大小的字符数组,比如char line[256];,这样就有了专门的内存区域来存放输入的一行内容。
问题2:结构体里的字符串指针未分配内存
你的struct profile里name和surname都是char *类型的空指针,sscanf尝试往这些指针指向的位置写入字符串时,同样会触发内存访问错误——因为这些指针根本没指向任何可用的内存。
这里可以把它们改成固定大小的字符数组,比如char name[50];和char surname[50];,这样就能容纳输入的姓名内容了。
其他需要注意的小细节
- 原代码的
while (fgets(line, 256, stdin)少了闭合的),你修改后的代码已经补上了,这点没问题; - 要检查
fopen的返回值,如果文件打开失败(比如权限不足),fp会是NULL,后续的fprintf会出错; - 循环里要限制
i的范围,不然超过people[10]的数组大小会导致数组越界,比如加上i < 10的判断。
修正后的完整代码
#include <stdio.h> int main() { FILE *fp; struct profile { char name[50]; // 改成固定大小数组,分配内存 char surname[50]; int year; int month; int day; } people[10]; int temp; int i = 0; char line[256]; // 改成数组,初始化内存 int j; // 检查文件是否成功打开 fp = fopen("reg.txt", "a"); if (fp == NULL) { printf("无法打开文件!\n"); return 1; } // 限制i不超过数组大小,避免溢出 while (i < 10 && fgets(line, 256, stdin) != NULL) { j = sscanf(line, "%s %s %d/%d/%d", people[i].name, people[i].surname, &people[i].year, &people[i].month, &people[i].day); // 检查sscanf返回值,确保输入格式正确 if (j != 5) { printf("输入格式错误,请按照「名 姓 年/月/日」的格式输入!\n"); continue; // 跳过错误输入,继续下一次 } ++i; } temp = i - 1; for (i = 0; i <= temp; ++i) { fprintf(fp, "NAME: %s %s\nBIRTHDAY: %d/%d/%d\n", people[i].name, people[i].surname, people[i].year, people[i].month, people[i].day); } printf("共写入%d条记录\n", temp + 1); fclose(fp); return 0; }
这个修正后的代码解决了核心的内存问题,还增加了输入格式校验和文件打开失败的处理,你可以试试运行看看效果~
内容的提问来源于stack exchange,提问作者Ogu Himean
相关产品推荐
相关产品推荐

