详解,c/c++输入输出缓冲区,以及scanf回车的问题

一.输出缓冲区

输出缓冲区是我们在dos窗口下,或终端下,linux/windows为我们分配的默认输出缓冲区大小,也就是窗口一次能容下多少字符!输出缓冲区大小是和图像一样的,用宽高来定义的,换句话说输出缓冲区就相当于一个小型屏幕,而屏幕的宽高由操作系统指定/用户,我们可以将我们程序运行时的一些数据输入到此缓冲区中,在屏幕中显示出来,列如(printf/cout)就是这样做的。

输出缓冲区是当我们运行一个以dos窗口为基础的c/c++程序时,操作系统会默认为我们调用一个dos窗口并将程序文件加载到dos系统中,由dos来运行!

输出缓冲区是默认的,但是我们可以手动来调节!

输出缓冲调节办法

将鼠标光标焦点挪移到dos窗口标题栏处,然后右键


选择属性


选择布局

扫描二维码关注公众号,回复: 170165 查看本文章


在这里调节屏幕缓冲区大小即可


这里我的是80*300,也就代表我的屏幕缓冲区最大可以存放:24000个像素!

一旦超出该范围就会删除递增替换掉原来的缓冲区数据!

列如

1 1 1

2 2 2

3 3 3

此时缓冲区已经满了,再往里写数据的话就会替换掉第一行

2 2 2 

3 3 3

4 4 4


二.输入缓冲区

是当你程序运行时用于保存暂时输入的数据的,就是平时我们在dos窗口上输入的数据,都会被放在输入缓冲区中,但是输入进去时也会显示在输出缓冲区上!

列如,你在dos窗口上正在输入数据,但是你的dos窗口输出缓冲区大小为5,那么当你输入超出5个像素时就会替换掉原先的输出缓冲区数据,但是不会替换掉输入缓冲区的数据!

相反,如果你输入缓冲区爆满的话也会被递增替换!

当你在一个只能存放5个像素的屏幕缓冲区中输入以下数据时

12345(此时是正常的)

当你输入第6个数据的时候就会递增替换

23456

三. scnaf回车的问题

不知道大家平时在编写c/c++程序时会有这样的问题

列如:

int a;
	scanf("%d%[\n]", &a);
	printf("%d", a);
	int b;
	scanf("%d%[\n]", &b);

在你使用scanf获取数据时当你输入完a变量的值时按下回车时,接收b的scanf直接跳过了!

这种问题的原因是因为,scanf不会去接收回车,而是以回车结束,当你在dos窗口上输入数据时都会被输入到输入缓冲区中,而scanf会冲输入缓冲区读取这些数据,scanf会以回车作为EOF(结束)标志,但它不会去读取回车!所以此时回车停留在输入缓冲区中,当我们执行下一次的scanf时就会被读取出来!而恰好scanf是以换行结尾的,所以才发生直接跳过的现象!

解决方法:

注意这种情况只有在输入字符时候才有效!

当你以%d或其他以整数为类型的格式占位符时不会出现这样的问题!

1.刷新输入缓冲区

fflush(stdin);

stdin:输入缓冲区,一般指键盘输入的数据,数据只有键盘才能输入,当然你也可以copy,不过那也是键盘打出来的数据!

2.使用getchar将缓冲区数据读取出来

getchar();

3.使用正则表达式

在scanf下面输入以下代码scanf会自动从stdin中读取一个空格

scanf("%[^ ]");不在以回车为结尾,以空格为结尾,仅在读取字符串情况下有效!

猜你喜欢

转载自blog.csdn.net/bjbz_cxy/article/details/79792552