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;
}
  • 执行该程序时,按道理讲应该用户来输入两次,一次输入一个数字,一次输入一个字符
  • 但是真实的结果是,输入了一个数字,敲了回车之后就打印了结果,而且结果就只是第一次输入的数字而已(这时心中先路过一万至草泥马,草泥马们让我调试试一下)
    那就调试一下吧,调试发现,嗯哼? 变量 c 已经赋值了啊,是 10 也就是字符 ‘\n’,这么一寻思好像有点道理???那道理具体是什么呢?
  • 道理就是: 假设我们输入的内容是 123\n 那么这内容会先存储在缓存区中,第一个scanf 函数,会将 123 赋值给变量 a ,而缓存区剩下了 ‘\n’ ,因为缓存区不是空的,因此执行第二个scanf时 就不会停下来让用户输入,从而直接在缓存区读取字符 ‘\n’,因此就有了上述的结果喽。

需要注意的是:

  • %d 会忽略缓冲区中开头的所有空白符,(回车 空格 制表符)
  • %c 然而,它会直接读取第一个字符,无论这个字符是什么

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

解决方法:

  1. 格式控制:在第二次输入一个字符是在 %c 前加上一个空格,空格会抵消前边的回车
  2. 清空缓存:在第一次输入后清空输入缓存区,用这个函数setbuf(stdin,NULL),这个函数并非标准库中的函数,是对标准库的扩充,有些编译器可能没有,因此并不建议使用。
  3. 使用 getchar() 不断获取缓冲区内的内容,直到缓冲区内空为止。其实起到的作用就是清空缓存。

猜你喜欢

转载自blog.csdn.net/qq_40860852/article/details/85267474
Why