为什么使用结构体编写的C语言程序在scanf输入SKS后停止运行?
问题原因
- 读取grade字段的
scanf语句缺少取地址符&:scanf读取基本类型变量时必须传入变量的内存地址,原代码中scanf("%c",students.grade)直接传入char类型的变量值,会被系统判定为非法内存地址,触发访问冲突导致崩溃,这是输入SKS后程序停止运行的核心原因。 - 输入SKS后缓冲区残留换行符:
%d格式符仅读取数字内容,输入数字后按下的换行符会残留在输入缓冲区,后续的%c会直接读取该换行符,无法正常录入等级信息,需要在%c前加空格跳过空白字符。 studNum变量未初始化就使用:局部变量默认值为随机内容,原代码中for循环的终止条件i<studNum行为完全不可控,可能导致循环执行异常。- 字符串输入存在越界风险:原代码的
%s未限制输入长度,一旦输入内容超过对应字符数组的容量,会越界覆盖其他内存区域,触发未知错误。
修复后代码
#include <stdio.h> struct studentScore { char nim[11]; char name[30]; char subjectCode[5]; int sks; char grade; } students; int main(){ printf("Name : "); scanf("%29s", students.name); printf("\nNIM :"); scanf("%10s", students.nim); printf("\nSubject Code :"); scanf("%4s", students.subjectCode); printf("\nSKS :"); scanf("%d", &students.sks); printf("\nGrade :"); scanf(" %c", &students.grade); // 单条学生信息直接打印,移除未初始化的studNum相关逻辑 printf("\nName : %s\n", students.name); printf("NIM : %s\n", students.nim); printf("Subject Code : %s\n", students.subjectCode); printf("SKS : %d\n", students.sks); printf("Grade : %c\n", students.grade); return 0; }
内容的提问来源于stack exchange,提问作者tetski
相关产品推荐
相关产品推荐

