C语言使用scanf读取学生信息时for循环无限运行如何解决
问题原因
你的代码存在两个核心错误,共同导致了循环运行异常:
- 变长数组声明顺序错误
你在N还未被赋值的情况下就声明了变长数组student list[N],此时N是栈内存中的随机垃圾值,数组初始大小完全不符合你的预期,后续写入数据极易触发越界访问,产生未定义行为。 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ș
相关产品推荐
相关产品推荐

