cin.ignore();就是去掉输入流里的第一个字符。
如果要清空缓冲区,放在开头是错误的。因为开头输入流一点东西也没有,没必要清空的。
所以要清空缓冲区,肯定要输入后。
#include<string>
#include<iostream>
int main() // small program messing around with strings
{
//::std::string name;
char name;
BEGIN_CIN:
::std::cout << " please enter the name: \n" ;
::std::cin >> name; //如果此处用string接住了,那么缓冲区里面就没有数据了,ignore同样没有作用。而用char来接,多余的字符的第一个字符会被ignore丢掉。
::std::cin.ignore(); //可以指定丢掉的字符数及分隔符如: ignore(2, '/n')
::std::cout << "the iostream is:[" << stdin->_ptr << "]\n"; //查看下截掉后的缓冲区数据
::std::string confirm;
::std::cout << "please confirm your name: " << name << " yes/no ?\n"; //确认下name的值
::std::cout << "the iostream222 is:[" << stdin->_ptr << "]\n"; //再次查看缓冲区,注意如果此时缓冲区中还有值,那么程序不会停下来等你输入。
::std::cout << stdin->_ptr; //只有此处都被ignore掉了以后std::cin才接受新的输入;所以要ignore的话一定要知道缓冲区大小,要将多余缓冲区ignore干净。
::std::cin >> confirm; //如果缓冲区没有清理干净,会自动赋给confirm,而不会期待用户输入
if (confirm == "yes") {
::std::cout << "success.\n";
}
else {
::std::cout << "failed.\n";
goto BEGIN_CIN;
}
return 0;
}
结果如下:
输入name: zhangsan 回车
看到缓冲区中除去赋值给name的‘z’ 应该剩下 'hangsan回车‘ 经过ignore之后,默认丢掉一个字符‘h’,所以剩下‘angsan回车‘ ,
值得注意的是ignore会把分隔符也截取出来;所以界面上会发现中括号[]之间会有个换行,同时在confirm环节;就会把剩余的缓冲区里面的内容
赋值给confirm,而不会再停下来等我们输入,而我们期待confirm要么是yes要么是no,所以这个ansan回车的字符必然会引起错误。
试想一下: 如果我的ignore足够大,那么就不会出现这个情况。修改如下;
::std::cin.ignore(255, '\n'); //可以指定丢掉的字符数及分隔符如: ignore(2, '/n')
将多余的缓冲区清掉,虽然还会有回车符号,但是并不影响等待用户输入的过程。输入yes 程序会继续执行。
感觉还是比较粗浅的了解,还有些疑惑没有解决,比如:为什么缓冲区中有个回车却不影响我输入的yes的效果?(欢迎探讨回复)
还有在第一种情况下如果我继续输入,缓冲区就会乱掉;我不是很理解。如下