玩家猜数游戏(v2.2)(scanf()函数运行机制大揭秘)

[预备知识]用户从键盘输入的数据都被保存至缓冲区中, 直到用户键入回车符时, 输入函数才从缓冲区中读取数据. scanf()函数按照指定格式读取缓冲区中的数据, 若读取失败, 则缓冲区中的非数字字符不会被读走. 

[问题提出]如果我们在程序开始执行时输入字母字符'q', 那么程序会怎样执行呢?

    从程序的执行结果可以看出, 输入字母字符'q'后, 程序直接完成一轮的猜数(在剩余的9次机会中, 玩家不能继续输入数值). 在一轮的猜数结束后, 未等玩家选择就结束了游戏: 这是因为输入字母字符'q'后, 这个字符被保存至缓冲区中. 接着我们按下回车键, scanf()函数从缓冲区中读取数据, 但缓冲区中的数据'q'和格式符%d不相符, 所以scanf()读取数据失败. 由于读取失败, guess的值仍然是一个随机值. 虽然读取失败, 但输入的非法字符仍保存在缓冲区中. 如果guess的值(随机数)和magic的值不相等, 那么循环不会结束(scanf()读取失败, 下一轮循环时依旧读取, 结果仍是失败, 就这样重复十次). 十次循环过后, 由于此时scanf()中的格式符为%c, 和缓冲区中的字符'q'相匹配, 所以此时将'q'读走, 之后变量flag的值就为'q', 这个值不满足继续循环的条件, 所以程序就此结束. 

    如果我们一开始输入的字符为'Y', 那么程序在本轮十次无效循环后, 会进入下一轮的循环, 并等待用户输入数值. 这是因为第一轮十次无效循环

猜你喜欢

转载自blog.csdn.net/weixin_42048463/article/details/115183912