近日,在不断的写程序的生涯中,我悟了!倘若给我一个时间间隙修炼个十年八年的话,C++的一切都会不在话下吧!应该!
——————废话和正文的分界线——————
- 本篇采用问题·解答的方式来记录本人遇到的C++的小问题及解决方案,各方案都是实践过的。
- 希望在不断的积累小问题和解决方案的过程中使我们使用C++更优雅,更得心应手
————————真·正文分界线——————————
- 重复读取数字问题
一段代码:
int i = 0;
cout << "Please input the number of donation: " << endl;
cin >> i;
Q:如何做到只读取数字,且能在用户误输入非数字时循环请求输入?
A:最好的方法是借助cin本身的特性:cin本身是istream类的对象,与标准输入流绑定(一般就是键盘)。它自带两个错误标志,正常都是true。当读取类型不匹配时,其中一个错误标准将置false。只要有一个错误标准是false,成员函数cin.good()返回值将是false,否则就是true···
Q:哦!懂了,改成
do{
cout << "Please input the number of donation: " << endl;
cin >> i;
}while(!cin.good());
就可以了吧?
A:错!我还没说完,cin的错误标志只要有一个是false,它就拒绝读取字符流!因此,要在循环体里面加上cin.clear()才行!它的作用是重置错误标志。但是仅仅是这样还没办法达到预期的结果,因为cin在遇到类型不匹配的读取时,将保留该字符在输入缓冲区!因此必须想办法清空输入缓冲区。常用的办法是用cin.sync()函数,该函数能清空输入缓冲区···
Q:懂了懂了,只要加两个函数就可以了吧?改成
do{
cout << "Please input the number of donation: " << endl;
cin.sync();
cin.clear();
cin >> i;
}while(!cin.good());
诶,怎么会出现死循环······
A:当然会死循环了,我还没说完···在cin.good()值为false的情况下,cin.sync()无法发生作用!因此,你错在两个函数二者的顺序!另外,cin对象本身能被强制转换为bool类型,其值正是cin.good()的值,因此优雅的完成这个任务应该是:
do{
cout << "Please input the number of donation: " << endl;
cin.clear();
cin.sync();
}while(!(cin >> i));
Q:awsl