一.输出缓冲区
输出缓冲区是我们在dos窗口下,或终端下,linux/windows为我们分配的默认输出缓冲区大小,也就是窗口一次能容下多少字符!输出缓冲区大小是和图像一样的,用宽高来定义的,换句话说输出缓冲区就相当于一个小型屏幕,而屏幕的宽高由操作系统指定/用户,我们可以将我们程序运行时的一些数据输入到此缓冲区中,在屏幕中显示出来,列如(printf/cout)就是这样做的。
输出缓冲区是当我们运行一个以dos窗口为基础的c/c++程序时,操作系统会默认为我们调用一个dos窗口并将程序文件加载到dos系统中,由dos来运行!
输出缓冲区是默认的,但是我们可以手动来调节!
输出缓冲调节办法
将鼠标光标焦点挪移到dos窗口标题栏处,然后右键
选择属性
选择布局
在这里调节屏幕缓冲区大小即可
这里我的是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("%[^ ]");不在以回车为结尾,以空格为结尾,仅在读取字符串情况下有效!