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

为何我的C语言NID卡录入程序仅接收首个输入后就终止?

问题分析与修复

你的程序接收第一个输入后就终止,核心原因是结构体里的所有char指针都是野指针——只声明了指针变量,没有指向有效的内存空间,直接用scanf写入会触发内存访问错误,导致程序崩溃。除此之外还有几个细节问题,一起给你修正:

主要问题点

  • 野指针:char* name_bangla这类指针未分配内存,直接写入会破坏内存。
  • fflush(stdin)是C标准未定义行为,不能用来清除输入缓冲区。
  • 读取整数后的换行符会残留缓冲区,导致后续%[^\n]读取空内容。
  • %s会截断带空格的输入,如果姓名包含空格,需要用%[^\n]。

修复后的代码

用字符数组代替指针(更简单,无需手动管理内存),同时处理输入缓冲区的换行问题:

#include <stdio.h>

// 定义足够大的字符数组长度,可根据实际需求调整
#define NAME_LENGTH 100
#define MONTH_LENGTH 20

struct DOB
{
    int date;
    char month[MONTH_LENGTH]; // 替换指针为字符数组
    int year;
};

struct NID
{
    char name_bangla[NAME_LENGTH];
    char name_eng[NAME_LENGTH];
    char f_name[NAME_LENGTH];
    char m_name[NAME_LENGTH];
    struct DOB s;
    int ID;
};

int main()
{
    struct NID my;
    int temp_char;

    // 读取孟加拉语姓名(支持空格)
    printf("输入孟加拉语姓名:");
    scanf("%[^\n]", my.name_bangla);
    // 清除缓冲区残留的换行符
    while ((temp_char = getchar()) != '\n' && temp_char != EOF);

    printf("输入英文姓名:");
    scanf("%[^\n]", my.name_eng);
    while ((temp_char = getchar()) != '\n' && temp_char != EOF);

    printf("输入父亲姓名:");
    scanf("%[^\n]", my.f_name);
    while ((temp_char = getchar()) != '\n' && temp_char != EOF);

    printf("输入母亲姓名:");
    scanf("%[^\n]", my.m_name);
    while ((temp_char = getchar()) != '\n' && temp_char != EOF);

    printf("输入出生日期(日):");
    scanf("%d", &my.s.date);
    while ((temp_char = getchar()) != '\n' && temp_char != EOF);

    printf("输入出生月份:");
    scanf("%[^\n]", my.s.month);
    while ((temp_char = getchar()) != '\n' && temp_char != EOF);

    printf("输入出生年份:");
    scanf("%d", &my.s.year);

    printf("输入ID号码:");
    scanf("%d", &my.ID);

    // 输出NID信息
    printf("\n=== NID卡信息 ===\n");
    printf("孟加拉语姓名:%s\n", my.name_bangla);
    printf("英文姓名:%s\n", my.name_eng);
    printf("父亲姓名:%s\n", my.f_name);
    printf("母亲姓名:%s\n", my.m_name);
    printf("出生日期:%d/%s/%d\n", my.s.date, my.s.month, my.s.year);
    printf("ID号码:%d\n", my.ID);

    return 0;
}

关键修改说明

  1. 替换指针为字符数组:避免野指针问题,无需手动分配/释放内存,适合初学者。
  2. 手动清除缓冲区:用while ((temp_char = getchar()) != '\n' && temp_char != EOF);替代fflush(stdin),符合C标准。
  3. 添加输入提示:让程序交互更清晰,避免用户无操作提示。
  4. 支持带空格的输入:用%[^\n]读取整行输入(直到换行符),解决姓名含空格的截断问题。

内容的提问来源于stack exchange,提问作者N Tahseen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:40:29