我们先来看一段代码和其运行结果
当我们输入b的值并敲击回车键之后,并没有让我们输入c的值,造成这个现象的原因是因为scanf的输入缓冲区的问题
scanf读取的数据并不是直接从键盘读取,而是键盘输入的数据会先放到输入缓冲区中,然后scanf从缓冲区中读取数据
1.输入10并敲击回车键之后输入缓冲区的内容如下
2.由于是以%d的形式读取数据所以scanf会读取缓冲区中的数据10 ,scanf中%d读取数据时,%d只识别“十进制整数”。对于%d而言,空格、回车、Tab键都是区分数据与数据的分隔符
。当scanf进入缓冲区读取数据的时候,如果%d遇到空格、回车、Tab键,那么它并不会采用,而是跳过取后面的数据,直到取到“十进制整数”
为止。读取成功之后输入缓冲区的内容如下。
3.输入20.0并敲击回车键之后输入缓冲区的内容如下
4.scanf以%f的形式读取字符时遇到空格、回车、Tab键,也不会采用,而是跳过取后面的数据,对于被跳过和取出的数据,系统会将它从缓冲区中释放掉
。读取成功之后输入缓冲区的内容如下。
5.scanf以%c的形式读取时,并不会跳过任何字符,所以执行到这一步时,scanf会读取缓冲区中的\n,因此会出现上方执行效果。 读取之后输入缓冲区的内容如下。
如何解决该问题呢?
由于getchar()也是从输入缓冲区读取数据,每次读取一个字符,所以我们可以使用getchar()这个函数把输入缓冲区的内容清空 ,添加下方蓝色框内的代码之后可以看到程序正常运行了