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

