永发信息网

C++ cout cin刷新流问题

答案:3  悬赏:60  手机版
解决时间 2021-05-08 15:15
  • 提问者网友:绫月
  • 2021-05-07 15:25
#include "stdafx.h"
#include <iostream>
#include <string>
#include <algorithm>
#include <numeric>
#include <vector>
using namespace std;
bool isshorter(const string &s1,const string & s2)
{
return s1.size()<s2.size();
}
bool gt6(const string &s)
{
return s.size()>=6;
}
int main()
{
while(true)
{
cout<<"please input words for sort:"<<endl;
vector<string> svec;
string word;
while(cin>>word)
svec.push_back(word);
sort(svec.begin(),svec.end());
vector<string>::iterator iter=unique(svec.begin(),svec.end());
svec.erase(iter,svec.end());
stable_sort(svec.begin(),svec.end(),isshorter);
vector<string>::size_type it=count_if(svec.begin(),svec.end(),gt6);
for(vector<string>::iterator iter2=svec.begin();
iter2!=svec.end();++iter2)
cout<<*iter2<<'\t';
cout<<endl;
cout<<it<<endl;
cout<<"continue? y or n"<<endl;
char c;
cin.clear(); //为何此处一定要使用cin.clear()??
cin>>c;
if(!cin||c=='n'||c=='N') break;
}
return 0;
}
问题如上见注释部分 标准库不是将cin与cout绑定了吗使用cout之后应该刷新cin流
为何此处不使用cin.clear()下面语句执行时会读取上个cin的输入而导致直接退出???
最佳答案
  • 五星知识达人网友:由着我着迷
  • 2021-05-07 15:57
cin.clear()是清失败位
比如cin.fail和cin.eof
而不是刷新流- -

刷新流可以用cout.flush()或者cout << flush或者cout << endl或者cout.setf( ios::unitbuf )
你这里使用cin.clear是为了清除上次的输入失败标记,比如cin一个int你输入一个字母
cin状态保持失败就不能继续输入
所以这种情况下要使用cin.clear来清除失败位
然后可以选择使用cin.ignore( 1024, '\n' )来清空上次输入遗留的字符,直到换行结束
全部回答
  • 1楼网友:拜訪者
  • 2021-05-07 17:12
因为你前面循环的退出条件是因为cin出了问题 这里又要使用cin来获取一个新值 所以需要清除cin的错误状态 然后重新获取cin值 int main() { int a; char c; cin>>a; cin>>c; cout<<a<< " "<<c<<endl; } 下面给出一个例子 如果你先输入一个3 再输入c程序则没问题 如果你先输入c看看呢
  • 2楼网友:摆渡翁
  • 2021-05-07 17:06
cin是清除缓存区的内容.,你如果在这一步,不使用,说明缓存区里面有内容了,所以就break了
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯