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
相关产品推荐
相关产品推荐

