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

为何我的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:35:00