为何我的C语言编译器会跳过第二个scanf?附代码问题详情
为什么你的第二个scanf会被跳过?问题分析与修复
嘿,我来帮你拆解下这个问题——你的代码里有几个关键问题叠加起来,导致第二个scanf看起来像是“被跳过”了,我们一步步来看:
1. 先解决编译/运行时的基础问题:未初始化/未定义变量
你的代码首先会遇到编译错误或运行时崩溃,因为:
eingabewert未初始化:第一次进入while(eingabewert != -1)时,这个变量的值是随机的,运气差的话循环会直接跳过,或者进入后出现不可预期的行为。counter完全未声明:你直接使用userMarks[counter]和counter +=1,编译器根本不知道counter是什么,会直接报错。- 你注释里提到的
ind promark笔误已经修正为int promark,这个没问题,但目前该变量还未被使用。
2. 循环逻辑颠倒,导致输入处理混乱
你当前的while循环是先判断条件再读取输入,这会引发两个问题:
- 如果
eingabewert的初始随机值刚好是-1,循环会直接跳过,完全不处理输入; - 当用户输入-1时,
scanf读取到-1后,仍会把它存入数组并让counter自增——这显然不符合你的需求,因为-1是结束标记,不该被存入数组。
正确的做法是使用do-while循环,先读取输入再判断是否退出:
do { scanf("%d", &eingabewert); if(eingabewert == -1) { break; // 遇到结束标记直接跳出循环,不存入数组 } if(eingabewert < 0){ // 把原代码的< -1改为<0,因为学生分数不能低于0 printf("A student can't have points less than 0.\n"); exit(0); } userMarks[counter] = eingabewert; counter += 1; } while(1); // 无限循环,直到遇到-1才退出
3. 输入缓冲区残留的换行符,是第二个scanf被跳过的直接原因
当你用scanf("%d", ...)读取整数时,用户输入完数字后会按下回车,这个换行符\n会留在输入缓冲区里。第一个循环结束后,第二个scanf会直接读取到这个换行符,误以为用户已经完成输入,因此根本不等待你输入,看起来就像是被跳过了。
解决这个问题很简单,在第二个scanf之前清空输入缓冲区:
// 把缓冲区里残留的字符(比如换行符)全部读取并丢弃 while(getchar() != '\n');
修复后的完整代码
我把所有问题都修正了,你可以直接运行测试:
#include <stdio.h> #include <stdlib.h> // 必须包含该头文件才能使用exit()函数 int main(){ int maxnote = 0; int eingabewert; int n = 0; int userMarks[200]; int counter = 0; // 初始化计数器 int promark; printf("Welcome, please enter your points, -1 to finish.\n"); do { scanf("%d", &eingabewert); if(eingabewert == -1) { break; } if(eingabewert < 0){ printf("A student can't have points less than 0.\n"); exit(0); } userMarks[counter] = eingabewert; counter += 1; } while(1); // 清空输入缓冲区,避免残留换行符干扰下一个scanf while(getchar() != '\n'); printf("Please insert the least points needed for 6:"); scanf("%d", &promark); printf("You entered: %d\n", promark); // 打印验证输入是否成功 return 0; }
额外提示
- 别忘了添加
<stdlib.h>头文件,否则exit()函数会报错; - 原代码里的分数判断
eingabewert < -1逻辑错误,应该改为eingabewert < 0,因为学生分数最低为0,而-1是我们约定的结束标记,已单独处理。
内容的提问来源于stack exchange,提问作者Omega09
相关产品推荐
相关产品推荐

