如何解决这个CIN对像的字串队列问题?


在VC6中运行如下程序:
#include <iostream.h>
void main()
{

char ch,ch1;
cout<<"please input a string:";
cin>>ch;
while (ch!='\n')
{
cout<<"ch:"<<ch<<endl;
cin>>ch1>>ch;
cout<<"ch1:"<<ch1<<endl;

}

}

结果:
please input a string:abcdefg
ch:a
ch1:b
ch:c
ch1:d
ch:e
ch1:f
ch:g

结论:
只要cin对像的缓冲队列中还有数据,它就会提取其中的数据赋给下一次类型匹配的变量.
可能造成的影响:
如果用户在第一次输入数据的时候没有按程序员的意思走,本来只是想接收一个字符,但用户却输进一串字符,那么在下一个cin中,变量ch1就可能不是程序员本来想要的东西了。

疑问:
如何解决这个问题?除了程序员另外编写一个检测程序、使用get,getline外。
如何将cin缓冲中的字符清空掉?我试过用clear 没成功。

7 个解决方案

#1


注意:cin.clear()是用来清除标志的,不是输入缓冲。
你要的功能是cin.ignore()来实现的:
#include <iostream.h>

void main()
{

char ch,ch1;
cout<<"please input a string:";
cin>>ch;
cin.ignore(100,'\n');  //这里第一参数是要略过的字符数,第二参为直到'\n'为止
while (ch!='\n')
{
cout<<"ch:"<<ch<<endl;
cin>>ch1>>ch;
cout<<"ch1:"<<ch1<<endl;

}

}

是要这个功能吧?

#2


你还是用文档查找功能吧,这个问题我以前查过:
首先,用CIN前清除流错误标志:cin.clear();
然后把cin的绶冲区中数据扔掉:cin.ignore(NUMBER, '\n');      //其中NUMBER为一个足
//够大的数,记得是一个std::.....之数的东东,还是建议你搜一下吧。

#3


#include <iostream>
#include <conio.h>

using namespace std;

int main()
// 清除缓冲区
{
char ch1, ch2;
cout << "input a char: ";
cin  >> ch1;

// 循环取走缓冲区字符
while ( getchar() != '\n' );
cout << "input a char again: ";
cin  >> ch2;

cout << "Your first input: " << ch1 << endl;
cout << "Your second input: " << ch2 << endl;

return 0;
}

#4


使用API函数同样可以清除控制台输入输出缓冲区
方法很多。。。

#5


若在STL里,最好用流的最大size作为ignore的第一参数:
cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');

附:ignore函数的声明:
istream& ignore();  //一个
istream& ignore(streamsize count);  //count个
istream& ignore(streamsize count,int delim);   //到delim前的count个

#6


CIN流的最大参数好像是4096.

#7


不会
学习~~~~~~~~

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号