在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 个解决方案
注意: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;
}
}
是要这个功能吧?
你还是用文档查找功能吧,这个问题我以前查过:
首先,用CIN前清除流错误标志:cin.clear();
然后把cin的绶冲区中数据扔掉:cin.ignore(NUMBER, '\n'); //其中NUMBER为一个足
//够大的数,记得是一个std::.....之数的东东,还是建议你搜一下吧。
#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;
}
使用API函数同样可以清除控制台输入输出缓冲区
方法很多。。。