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

为什么使用结构体编写的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:42:04