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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:48:29