scanf函数的\n问题

CM Lv3

问题:

1
2
3
4
5
6
7
8
#include <stdio.h>
int main()
{
int a,b,c;
scanf("%d %d\n",&a,&b);
printf("bingo");
return 0;
}

这段代码,scanf函数里面的输入最后有一个\n。这段代码运行结果如下:

可以看到,第一次输入1 2以后回车以后并没有结束输入,即使多次回车还是无法结束scanf函数。

除非再次输入1 2然后回车,scanf函数才执行完毕。

这是为什么?

  1. scanf函数的基本原理:C程序执行scanf时,会从缓冲区读数据,如果缓冲区是空的,就阻塞住,等待你从键盘输入。输入结束后按回车会执行scanf函数,程序会逐个读取缓冲区的数据。注意,这时会将我们最后打的回车也就是\n留在缓冲区(缓冲区只剩下\n)。

  2. 加入\n以后。如果在scanf函数的双引号内加入\n并且\n后面还要输入整型即%d,并不会造成影响,因为缓冲区中的\n是字符,并不会被当作%d读入,会被忽略而读取后面的整型数据。示例:


    可以看到此时并不会出现开头所说的那种需要输入俩遍的问题。

而如果后面输入字符型即%c,这时就需要特别注意,因为缓冲区的\n会被当作%c读入,这样就会存在问题。为了解决这一问题,可以用到scanf末尾加\n的方法。

  1. 前面的都是拓展,这个问题真正的原因是:如果给scanf末尾加上\n,\n不表示等待换行符,而是读取并放弃连续的空白字符,你输入结束之后按回车不会结束,无论再输入多少空白字符(空格、制表符、回车)都会被忽略,要等再接收到一个非空白字符的输入后scanf语句才结束。但需要注意的是,最后输入的那个非(空格、制表符、回车)的东西是不会被这个scanf读进来的,而是留在缓冲区中。


因此你看,还是原来的代码,我输入1 2以后怎么回车都没用。然后只有当我再次输入一个非空白字符,也就是那个3以后,我再回车,scanf函数就读取缓冲区结束了。并且也可以看到最后输入的3并没有被scanf函数读取。

  • Title: scanf函数的\n问题
  • Author: CM
  • Created at: 2023-10-01 17:11:39
  • Updated at: 2023-10-01 17:36:39
  • Link: https://redefine.ohevan.com/2023/10/01/scanf函数的-n问题/
  • License: This work is licensed under CC BY-NC-SA 4.0.
 Comments
On this page
scanf函数的\n问题