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

C语言猜数字游戏中game()函数后的scanf被跳过是什么原因?

问题原因及修复方案

你遇到的scanf被跳过的问题、以及代码隐含的其他问题修复如下:

1. 核心问题:输入缓冲区残留换行符导致读取字符失败

之前调用scanf("%d")读取用户猜的数字时,仅会读取输入的数字本身,用户按下回车产生的\n换行符会残留在输入缓冲区中。后续执行scanf("%c", &yon)时,%c会直接读取缓冲区中残留的换行符,不会等待用户输入,看起来就像语句被跳过了。
修复方法:把所有读取Y/N的scanf("%c", &yon)语句,修改为scanf(" %c", &yon),在%c前加一个空格。这个空格会让scanf自动跳过所有前置空白字符(包括换行、空格、制表符),就能正常读取用户输入的Y/N了。

2. 隐含bug:guesscounter变量未初始化

game函数中定义guesscounter时没有给初始值,它的初始值是内存中的随机垃圾值,会导致猜数字的循环次数完全不符合预期。
修复方法:把game函数开头的变量定义修改为:

int guessnum, conum, guesscounter = 0, guesslimit = 3;

直接给guesscounter赋初始值0即可。

3. 优化点:随机种子初始化位置错误

你把srand(time(NULL))放在了game函数中,每次调用游戏都会重置随机种子。因为time(NULL)返回的是秒级时间戳,如果短时间内多次重开游戏,生成的随机目标数会完全一致。
修复方法:把srand(time(NULL));从game函数中移除,放到main函数最开头执行,整个程序运行过程中仅初始化一次随机种子即可。

内容的提问来源于stack exchange,提问作者Ralph Daniel Honra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:15:00