为何我的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; }
关键修改说明
- 替换指针为字符数组:避免野指针问题,无需手动分配/释放内存,适合初学者。
- 手动清除缓冲区:用
while ((temp_char = getchar()) != '\n' && temp_char != EOF);替代fflush(stdin),符合C标准。 - 添加输入提示:让程序交互更清晰,避免用户无操作提示。
- 支持带空格的输入:用
%[^\n]读取整行输入(直到换行符),解决姓名含空格的截断问题。
内容的提问来源于stack exchange,提问作者N Tahseen
相关产品推荐
相关产品推荐

