一、问题描述
在学习b站鹏哥c语言时跟着做三子棋的项目在使用scanf()函数时遇到了出乎意料的问题,图片如下:
问题一共有两个:
(1)在一开始需要输入两次1才能继续执行程序
(2)输入坐标2 2时,本应在坐标2行2列位置填充*号,但输出结果却显示在1行2列
二、问题思考
这就让我百思不得其解了,怎么会出现这种问题呢?于是我监视了x,y变量:
可以看到在左侧的变量监视窗口中x的值确实为1。从结果来看应该是缓存区中的1未被及时读取,而是被Playermove中的scanf读取了。
于是我询问了同学,提出应该是scanf("%d\n")中,加上了换行符\n,这样会导致scanf尝试读取并匹配输入中的换行符,直到输入非空白字符为止(输入另一个非空白字符后scanf会进行下一次读取)。所以为什么程序一开始输入第一个1再按下回车时程序不会立即执行呢?并且缓冲区中的1是怎么遗留下来的?
希望有大佬能解答下。