1. 当缓冲区中有残留数据时,cin函数会直接去读取这些残留数据而不会请求键盘输入。而且,回车符也会被存入输入缓冲区中。

int num{};
while(cin>>num)
cout<<num<<endl;

这意味着两个问题:

(1)如果插入了非法字符,不能转化为int类型,那么将始终留在缓存区,阻塞正常输入。换行符‘\n’也是非法字符;

(2)如果(变量获取的元素个数)少于(键盘输入字符数),如用ch获取字符串,可以实现逐一读取输入的字符;

2. 我习惯的清空缓存去方法

cin.ignore(, '\n'); // 把回车(包括回车)之前的所以字符从输入缓冲流中清除出去
cin.get(num).get() //每次输入顺便去掉回车

3. 实例:

从键盘输入数字存入数组,直接回车可以允许为空输入(C++ Primer Plus 6.7):

 #include <iostream>
#include <cctype> using namespace std; int main() {
const int DAY = ; auto *fish = new unsigned int[DAY];
char temp = {}; for (int day = ; day < DAY; day++) {
cout << "请输入第" << day+ << "天的战绩:"; cin.get(temp).get();
cout << "从缓存去读取了ASCII:" << static_cast<int>(temp) << endl; if (temp < '' and isdigit(temp)) {
fish[day] = static_cast<unsigned int>(temp - );
}
else if (temp == 'q' or temp == '\n') { continue;
}
else {
cout << "输入有误,退出系统\n";
break;
} } cout << "显示结果:\n";
for (int i = ; i < DAY; i++) {
cout << "第" << i+ << "天的战绩:" << fish[i] << "条\n";
}
}

程序说明:

程序逐一输入每一天的战绩,如果输入(1,2,3,4,5)中的一个,如果正确存入对应数组位置,直接回车或者输入‘q'跳过,输入无效字符推出程序。其中:

cin.get(temp).get()或者 在之后添加 cin.ignore(100, '\n'),都可以实现清除缓存区,清除上一次输入对后一次的影响。

关于cin的缓存区影响效果的更多相关文章

  1. 【MINA】缓存区ByteBuffer和IOBuffer你要了解的常用知识

    mina中IOBuffer是Nio中ByteBuffer的衍生类,主要是解决Bytebuffer的两个不足 1.没有提供足够灵活的get/putXXX方法 2.它容量固定,难以写入可变长度的数据 特点 ...

  2. csapp lab3 bufbomb 缓存区溢出攻击 《深入理解计算机系统》

    这个实验主要是熟悉栈,和了解数据缓存区溢出的问题. 数据缓存区溢出:程序每次调用函数时,会把当前的eip指针保存在栈里面,作为被调用函数返回时的程序指针.在被调用程序里面,栈是向下增长的.所有局部变量 ...

  3. 一个fork的面试题——fork + 缓存区

    update : 20140512 题目:请问下面的程序一共输出多少个“-”? #include <stdio.h> #include <sys/types.h> #inclu ...

  4. Oracle关于快速缓存区应用原理

    为什么oracle可以对于大量数据进行訪问时候能彰显出更加出色表现,就是通过所谓的快速缓存来实现数据的快速运算与操作.在之前的博文中我已经说过sql的运行原理,当我们訪问数据库的数据时候,首先不是从数 ...

  5. sed原理及sed命令格式 ,缓存区,模式空间

    4.1            Sed工作原理 sed是一个非交互式的流编辑器.所谓非交互式,是指使用sed只能在命令行下输入编辑命令来编辑文本,然后在屏幕上查看输出:而所谓流编辑器,是指sed每次只从 ...

  6. C语言之清空缓存区

    感谢大佬:https://blog.csdn.net/qq_26768741/article/details/50933598 在C语言中,我们常常需要去清空缓存区,对于缓存区清空的重要性,接下来我们 ...

  7. node(Buffer缓存区)

    // 创建buffer类 var buf=new buffer(10); var buf=new buffer([10,20,30,40]); var buf=new buffer("www ...

  8. ACM/ICPC 之 优先级队列+设置IO缓存区(TSH OJ-Schedule(任务调度))

    一个裸的优先级队列(最大堆)题,但也有其他普通队列的做法.这道题我做了两天,结果发现是输入输出太过频繁,一直只能A掉55%的数据,其他都是TLE,如果将输入输出的数据放入缓存区,然后满区输出,可以将I ...

  9. git --如何撤销已放入缓存区(Index区)的修改

    修改或新增的文件通过 git add --all 命令全部加入缓存区(index区)之后,使用 git status 查看状态(git status -s 简单模式查看状态,第一列本地库和缓存区的差异 ...

随机推荐

  1. Oracle12c安装和卸载图文教程

    注:本文来源于:<Oracle12c安装和卸载图文教程> 一.安装 1.去官网下载相应的版本 2.下载好的两个压缩文件压缩到一个文件夹中 3.打开上个步骤的文件夹,运行stepup,显示如 ...

  2. Confluence 6 禁用管理员联系表单

    如果你希望禁用这个功能,不允许用户通过发送电子邮件的方式联系站点管理员.你可以禁用这个页面中有关输入用户信息发送电子邮件的部分.你只能禁用用户电子邮件输入表单,如果你按照上面描述的步骤在 'Custo ...

  3. python之vscode中手动选择python解释器(mac)

    要选择特定的解释器,请从命令选项板(⇧⌘P)调用Python:Select Interpreter命令. 更详细请看:http://www.cnblogs.com/it-tsz/p/9312151.h ...

  4. js 判断输入的内容是否是整数

    需求简介:列表有一列排序,其值只能是整数,不能是小数,在js中判断,并给出提示 解决思路:在js中先获取表单的值,然后用isNaN,然后查一下怎么把小数排除在外.我靠( ‵o′)凸,这只能算是半路把! ...

  5. C++ gethostname()

    使用“gethostname();”获取计算机名,先看源码: 在Code::Blocks 16.01中,设置project的Build options...,Debug > Linker set ...

  6. Jmeter 谷歌插件工具blazemeter录制脚本

    1.下载谷歌浏览器插件工具:blazemeter. 2.在谷歌浏览器中拖放安装扩展工具:blazemeter. 粘贴的图像828x219 13.5 KB 3.测试网站利用这个工具录制jmter脚本. ...

  7. ajax请求成功 但是被error拦截

    前端与后台的数据格式不符合 例如后台发过来的一段数据格式是json 然而我们却用默认的fromData去解析,便会被error拦截 在ajax 添加 dataType:'json',

  8. 011-Python-进程、线程于协程

    1.进程与线程 进程: 一个程序要运行时所需的所有资源的集合: 一个进程至少需要一个线程,这个线程称为主线程,一个进程里可以包含多个线程: cpu 核数越多,代表着你可以真正并发的线程越多2个进程之间 ...

  9. SqlServer 分页存储过程

    SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[usp_CommonDataResourcePaged ...

  10. jdk1.8学习、jdk1.9学习、jdk10.0学习和总结

    由于中文参考资料很少,参考链接: https://www.oschina.net/translate/109-new-features-in-jdk-10 http://chuansong.me/n/ ...