返回信息流自从开始学C++我就被里面的各种细节各种虐,简直无法好好玩耍了,说好的三个月入门到精通呢???
代码:
#include <iostream>
int main()
{
using namespace std;
char name [10];
cout << "input a name:\n";
cin.get(name, 10);
cout << "the name you input is:" << name << endl;
cin.sync();
cin.clear();
char a = cin.get();
cout << int(a) << endl;
system("pause");
return 0;
}
运行结果:
input a name:
asldalfkhlalakdsnfla
the name you input is:asldalfkh
108
请按任意键继续. . .
编译环境:VS2015
问题:
在网上搜到cin.clear(),cin.sync()可以清除输入缓存,可是为什么还是没有作用?后面的字符还是留在缓存中?
本来以为这是一种解决输入后缓存中遗留的换行符的办法···
这是一条镜像帖。来源:北邮人论坛 / cpp / #95667同步于 2017/6/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
心很累—_—!!!!!关于清除C++输入缓存
unimit
2017/6/26镜像同步14 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
http://www.cplusplus.com/forum/general/63860/
cin.sync()的实现在不同编译器下有所不同。比如这份代码在TDM-GCC(4.9.2,x64)环境下会清除输入缓存,而在vs2017(以及你的vs2015)下就不会。
稳妥起见,避免使用sync,改用ignore.具体做法请参见上面的链接
多谢回答!
现在对C++这语言还一知半解,有两个问题:1、平时遇到这种莫名其妙的坑,你是怎么搜索答案的,比如说我这个问题(C++清除输入缓存)在网上搜了半天,都是讲这个cin.clear和cin.sync,也没搜到要点上。
2、照这个网址改了代码,还是没有作用、、、
#include <iostream>
int main()
{
using namespace std;
char name [10];
cout << "input a name:\n";
cin.get(name, 10);
cout << "the name you input is:" << name << endl;
cin.clear();
cin.ignore(std::numeric_limits<std::streampos>::max(), '\n');
char a = cin.get();
cout << int(a) << endl;
system("pause");
return 0;
}
准备换个编译器试试,但是Windows下不知道还有什么好的编译器?然后就是寻找能在VS下清除输入缓存的方法。
【 在 Kxzuir 的大作中提到: 】
: http://www.cplusplus.com/forum/general/63860/
: cin.sync()的实现在不同编译器下有所不同。比如这份代码在TDM-GCC(4.9.2,x64)环境下会清除输入缓存,而在vs2017(以及你的vs2015)下就不会。
: 稳妥起见,避免使用sync,改用ignore.具体做法请参见上面的链接
cin和cout这种东西,不要深究,深究也意义不大,只是个入门用的工具而已,工作使用的多数是图形界面,即使是acm之类算法比赛使用的也一般是读取文件,基本不会用到cin一串控制台手输的东西,不需要为了这个心累。
一般问题百度就能搜出来,复杂点的问题,csdn论述去问。
第一个问题,百度搜索出来的大部分都是互相转载的过时文章,这种问题去谷歌直接就有很明确的答案(how to flush cin buffer,第一个就是)
第二个问题,我没实测抱歉。。。std::numeric_limits<T>::max()这个用法要求T必须是(或等同于)基本类型(如char、int)才可以,std::streampos这个貌似并没有被视为基本类型,所以要么用
cin.ignore(numeric_limits<streamsize>::max(), '\n'); //这是标准用法
或者稍微不严谨地直接将第一个参数设置成很大的数,如
cin.ignore(INT_MAX, '\n');
就可以了。
Windows下一般的小程序可以直接用Dev-C++或者Codeblocks处理,感觉还是很方便的。大点的工程还是用VS吧,毕竟微软爸爸= =
另外部分同意楼上观点,这类问题不太重要,不过知道也是好的
【 在 unimit 的大作中提到: 】
: 多谢回答!
: 现在对C++这语言还一知半解,有两个问题:1、平时遇到这种莫名其妙的坑,你是怎么搜索答案的,比如说我这个问题(C++清除输入缓存)在网上搜了半天,都是讲这个cin.clear和cin.sync,也没搜到要点上。
: 2、照这个网址改了代码,还是没有作用、、、
: ...................
真的非常感谢,换成INT_MAX后确实可以清除了,看来我还是没有活学活用,百度确实不靠谱,还好有论坛可以学习交流。其实去年系统学过一次C++,学完还是云里雾里,这是第二次学,所以想着坚决要学仔细点。对于C++我实在有点无语了,所以我还一边看Python,作为交叉学习,渐渐理解那句,人生苦短,我用Python。
【 在 Kxzuir 的大作中提到: 】
: 第一个问题,百度搜索出来的大部分都是互相转载的过时文章,这种问题去谷歌直接就有很明确的答案(how to flush cin buffer,第一个就是)
: 第二个问题,我没实测抱歉。。。std::numeric_limits<T>::max()这个用法要求T必须是(或等同于)基本类型(如char、int)才可以,std::streampos这个貌似并没有被视为基本类型,所以要么用
: cin.ignore(numeric_limits<streamsize>::max(), '\n'); //这是标准用法
: ...................