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

C语言使用scanf读取学生信息时for循环无限运行如何解决

问题原因

你的代码存在两个核心错误,共同导致了循环运行异常:

  1. 变长数组声明顺序错误
    你在N还未被赋值的情况下就声明了变长数组student list[N],此时N是栈内存中的随机垃圾值,数组初始大小完全不符合你的预期,后续写入数据极易触发越界访问,产生未定义行为。
  2. scanf格式串使用错误
    你在读取学生信息的scanf格式串末尾多写了\n:scanf("%d %c %s %s\n", ...)。scanf中所有空白字符(空格、换行、制表符)都会匹配输入流中任意数量的连续空白,直到遇到第一个非空白字符才会停止匹配。这就导致每次输入完一行学生信息后,scanf不会立刻返回,会一直等待你输入下一个非空白字符,看起来就像循环不会停止、运行次数超过设定值。
    另外还有一个隐性问题:读取char类型的%c前没有加空格,会直接读取输入缓冲中残留的换行符,导致gender字段读取错误。

修复方案

按以下步骤修改代码即可,无需替换scanf:

  • 交换N读取和数组声明的顺序,先读入N的有效值再声明变长数组
  • 删除scanf格式串末尾的\n
  • 在%c前添加空格,跳过输入缓冲中的残留空白

修复后完整代码

#include <stdio.h>
#include <string.h>

typedef struct STUDENT_CONSTRUCTOR {
    char first_name[35], last_name[35];
    char gender;
    int grade;
} student;

int main(void) {
    int N; // number of entries

    printf("Number of entries: "); 
    scanf("%d", &N);
    // 先读N再声明数组
    student list[N];

    for (int i = 0; i<N; i++) {
        printf("<Entry %d>\n", i);
        // 删末尾\n,%c前加空格
        scanf("%d %c %s %s", &list[i].grade, &list[i].gender, list[i].first_name, list[i].last_name);
    }

    // 测试输出验证读取是否正确
    for (int i = 0; i < N; i++) {
        printf("Entry %d: %d %c %s %s\n", i, list[i].grade, list[i].gender, list[i].first_name, list[i].last_name);
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Mario Mateaș

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:27:04