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

C语言猜数字程序scanf未读取输入直接结束问题排查

问题根因
  • scanf()读取%d类型的整数时,只会读取数字内容,用户输入完数字按下的回车(对应换行符\n)会残留在输入缓冲区中,不会被整数读取逻辑带走。
  • 当程序执行到读取y/n选项的scanf("%c", &way)时,会直接读取缓冲区里残留的换行符赋值给way变量,不会等待用户输入新字符。由于换行符不等于'y',循环判断直接不成立,程序就会直接终止。
  • 代码还存在一处隐藏逻辑bug:随机数生成语句写在了do-while循环外侧,就算修复输入问题,下一轮游戏的答案也会和上一轮完全一致,不会生成新的随机数。
修复后完整代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    srand(time(NULL));
    int guess;
    int number;
    char way = 'y';
    do
    {
        // 每轮开局重新生成随机数
        number = 1 + rand() % 1000;
        printf("I have a number between 1 and 1000.\n");
        printf("Can you guess my number?\n");
        printf("Please type your first guess.\n");
        scanf("%d", &guess);
        while (guess != number)
        {
            if (guess < number)
                puts("Too low. Try again!");
            else if (guess > number)
                puts("Too high. Try again!");
            scanf("%d", &guess);
        }
        printf("Excellent! You guessed the number!\n");
        printf("Would you like to play again (y or n)?: ");
        // %c前加空格,自动跳过缓冲区残留的空白字符
        scanf(" %c", &way);
    } while ('y' == way);
    return 0;
}
关键修改说明
  • 将随机数生成逻辑number = 1 + rand() % 1000;移动到do-while循环内部,保证每次开启新游戏都会生成全新的1~1000范围内的随机数,不会复用旧答案。
  • 将读取选项的scanf格式串从"%c"修改为" %c":格式串开头的空格会让scanf自动跳过输入缓冲区中所有前置的空白字符(包括之前读取整数残留的换行符、空格、制表符),确保能正确读取到用户主动输入的y/n选项。

内容的提问来源于stack exchange,提问作者Arthur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 16:57:23