首先这个知识我是在《C++ primer plus》第六版这本书上了解到的,在第六章的187页开始,对于cin标准输入流检测到用户输入了错误内容时,一般情况下应采取以下三个步骤一一进行:
1.重置cin以接受新的输入。
2.删除错误输入。
3.提示用户再输入。
第一步重置cin以接受新的输入是要最先做的,一般用成员函数clear();形式为cin.clear();如果省略这条语句,程序将拒绝继续读取输入。cin.clear()是用来更改cin的状态标示符的。通俗的讲就是将一个出错的“流”恢复为“好”,并设置goodbit状态位。
cin输入流的机制是:
当遇到无效字符或遇到文件结束符(不是换行符,是文件中的数据已读完)时,输入流cin就处于出错状态,即无法正常提取数据。此时对cin流的所有提取操作将终止。在 IBM PC及其兼容机中,以Ctrl + Z表示文件结束符。在UNIX和Macintosh系统中,以 Ctrl + D表示文件结束符。当输入流cin处于出错状态时,如果测试cin的值,可以发现它的值为false(假),即cin为0值。如果输入流在正常状态,cin的值为true(真),即cin为 一个非0值。可以通过测试cin的值,判断流对象是否处于正常状态和提取操作是否成功。如:
if(!cn) //if表达式判断为真时cin输入流处于出错状态,无法正常提取数据
cout<<"error";
实例程序:
//cin表达式输出错误类型的解决办法
#include<iostream> const int Asize = 5; int main() { using namespace std; int golf[Asize]; int i,sum = 0; float ave; for(i = 0;i < Asize;i++) { cout << "round # " << i + 1; while(!(cin >> golf[i])) { cin.clear(); while(cin.get() != '\n') { continue; } cout << "Please enter a number:"; } } for(i = 0;i < Asize;i++) { sum = sum + golf[i]; } ave = (float)sum / Asize; cout << ave << endl; return 0; }
程序运行结果如下图所示:
while(!(cin >> golf[i])) { cin.clear(); while(cin.get() != '\n') { continue; } cout << "Please enter a number:"; }首先代码块的外部是一个大的while循环,先是判断括号中的表达式
cin >> golf[i]
倘若cin输入流读取正常,则cin输入流返回bool值true,这样的话!true则为false,所以在正常输入流读取的情况下,是不会进入错误处理的代码块内部的,读取正常的情况下,每个读取的值一一存储在整型数组中,而当用户输入不当的内容时,输入流读取错误从而返回false,所以外部while循环为真而进入代码块内部,从而开始进行一开始的“三部曲”。cin.clear();使输入流恢复正常后,然后接着内部while循环,是用cin.get()成员函数一个个的读取输入的错误内容,直到最后输入的回车符,错误内容读取完毕,再提示用户应该输入的类型。图示如下:
↓
dsads(Enter回车) 一开始输入流cin读取到第一个字符时,检测到输入错误
cin输入流恢复正常后,cin.get()成员函数再一一读取错误字符
↓
dsads(Enter回车) 从当前位置开始,一一读取过去
↓
dsads(Enter回车) 直到回车符结束,由于只是读取没有保存,所以就相当于是删除了这些错误内容
cout <<"Please enter a number:";
然后再提示用户输入正确内容存储到整型数组中。
新手C++入门,如有错误还请指正,谢谢。