天天看点

Why?? 第二次的scanf()不执行

今天写程序,调试时发现了这个问题,网上搜了很多大佬的解答,基本明白了咋回事。

问题就是出现在 缓存区

  • 函数

    scanf()

    从标准输入设备(键盘) 读取输入的信息并不会直接赋值给变量,而是会先被储存到一个缓冲区中,当程序执行到函数

    scanf()

    时,程序会从缓冲区中读取,如果缓冲区是空的,停滞下来,光标闪烁,等待用户键盘的输入。

举个栗子:

#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "stdlib.h"
int main() {
	int a;
	char c;
	scanf("%d", &a);
	scanf("%c", &c);
	printf("%d %c", a, c);
	system("pause");
	return 0;
}
           
  • 执行该程序时,按道理讲应该用户来输入两次,一次输入一个数字,一次输入一个字符
  • 但是真实的结果是,输入了一个数字,敲了回车之后就打印了结果,而且结果就只是第一次输入的数字而已(这时心中先路过一万至草泥马,草泥马们让我调试一下)
    Why?? 第二次的scanf()不执行
  • 那就调试一下吧,调试发现,嗯哼? 变量

    c

    已经赋值了啊,是

    10

    也就是字符

    '\n'

    ,这么一寻思好像有点道理???那道理具体是什么呢?
    Why?? 第二次的scanf()不执行
  • 道理就是: 假设我们输入的内容是

    123\n

    那么这内容会先存储在缓存区中,第一个

    scanf

    函数,会将

    123

    赋值给变量

    a

    ,而缓存区剩下了

    '\n'

    ,因为缓存区不是空的,因此执行第二个

    scanf

    时 就不会停下来让用户输入,从而直接在缓存区读取字符

    '\n'

    ,因此就有了上述的结果喽。

需要注意的是:

  • %d

    会忽略缓冲区中开头的所有空白符,(回车 空格 制表符)
  • %c

    然而,它会直接读取第一个字符,无论这个字符是什么

有了问题,那我们该怎么解决呢??

解决方法:

  1. 格式控制:在第二次输入一个字符是在

    %c

    前加上一个空格,空格会抵消前边的回车
  2. 清空缓存:在第一次输入后清空输入缓存区,用这个函数

    setbuf(stdin,NULL)

    ,这个函数并非标准库中的函数,是对标准库的扩充,有些编译器可能没有,因此并不建议使用。
  3. 使用

    getchar()

    不断获取缓冲区内的内容,直到缓冲区内空为止。其实起到的作用就是清空缓存。

继续阅读