1.以下程序:
#include<iostream>
int main()
{
int i;
std::cin>>i;
std::cin.clear(std::istream::failbit|std::istream::eofbit);
std::cin.ignore(200,'\n');
std::cin>>i;
return 0;
}
为什么这个程序会失败呢?都怪这个clear的名字起的不好.从以上程序,我的原本意图是把failbit和eofbit给clear掉.但是.这个语句的意思是.先调用std::cin.clear().然后再把failbit和eofbit设置为true..那就与原意正好相反了.但是奇怪的是除了百度知道上有人回答这个奇怪的事情以外,其他地方没有看到讲解.
包括,有的书上都写错了.不是不小心,甚至连作者都没有理解.比如说C++PRIMER习题解答P99页习题8.3 .上面竟然还说"笔者所使用的编译器不能正确支持in.clear(istream::failbit);语句" 这就是理解问题了.我觉得肯定有人和我有一样的问题,所以就把这个写上来.
2.ignore
ignore在C++PRIMER里没有详细讲,但是习题里面要用到(没素质..).因为看C++PRIMER里没详细说明,因此让我处理得很麻烦.因为自己也是菜鸟,只能解释一下可以看到的现象,不能解释本质了
std::cin.ignore(200,'\n);
std::cin>>str;
上面的ignore对下面的输入还是有效果的.但只作用一次.这样输入的话,第一次输入是被跳过的.还会输第二次.对于这个我是如此理解的.cin就像是一个水壶.我们键盘输入的内容就是往水壶里面灌水.只要灌进去,它就往外倒.如果发现倒不进去.例如给int型输入一个字符,那么就会保留.在倒出所有的水("除了空格换行符")之前,是不给你键盘输入的机会的.比如说如下程序:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
int i;
cin>>i;
cin.clear();
cin>>str;
cout<<i<<endl
<<str<<endl;
return 0;
}
如果第一个输入w,就算是水没倒出去,那么调用clear函数后,不用输入,会把上次灌的水倒入str里面.那么str的值就是你第一次试图赋给int的值.好了,现在就可以合理的解释一下了
std::cin.ignore(200,'\n');
std::cin>>str;
如果我输入:abcdefg\n
那么是没用的因为你打出回车的时候,就相当于打了一个换行符.再遇到换行符所有的东西通通扔掉.但是cin的默认设置应该是忽略换行符,也就是说abcdefg都被扔掉了.\n又不会被输入进去,因此在你再次输入之前,cin里面存的就是\n.
你已经输入过\n,那太好了!做个形象的比喻,如果ignore是个封印,阻止你输入一些东西,那么\n就是解除封印.于是,你的第二次输入就有效了
最后我再强调一下.如果你具有高智商,受不了我冗长的解释,也不要骂我...这与其说是给别人看,不如说给未来的我解释.建议能利用到我这篇文章信息的人,不要完全相信我的话,应该努力看一些高阶的书,然后真正地学会运用