C++ 的cin输入注意【转】
我们定义要输入到的变量是整型,但如果我们输入了英文字母或者汉字,那就会发生错误,不能继续输入或操作。
你可以在程序中添加如下程序,来清空cin的输入缓冲区重新输入
if(!cin)
{
cout<<"输入有错!请重新输入"<<endl;
cin.clear();
cin.sync(); //清空流
}
cin.sync(); 这个是用来清空cin缓冲区里面未读取的信息...
例如:
#include <iostream>
using namespace std;
void main()
{
int n;
cout<<"请输入数字:";
while(!(cin>>n))
{
cin.sync();//清除缓冲区
cin.clear();//清除错误状态,在这个程序里,两个必须一起用,否则
达不到效果
cout<<"您只能输入数字,请重新输入:";
}
}
1、每一个输入(输出)对象就代表一个输入(输出)流
2、输入(输出)对象中的流状态成员标记了输入(输出)流当前的状况,当eofbit、badbit、failbit三个标记位均为0时表示流状态正常
3、一但某个或几个标记位被设置,表示对象的流状态出现相应状况,流将对后面的输入(输出)关闭,直到标记位被清除
4、只有在流状态良好的情况下,if或者while对该输入(输出)对象的判断才能是true
cin.clear(); //清除cin流的错误状态
C++语句cin.clear();中的clear()是什么函数,原型是?
答:检举将一个出错的流的状态恢复为“好”。但也不完全是,因为它也可以把“好”的流变成“坏”。
其默认参数为:
ios::goodbit
故语句:
cin.clear()
清除cin流,并设置goodbit状态位。
同理,语句:
cin.clear(ios::failbit)
清除cin流,并设置failbit状态位,该位代表一般可修复的小错误,自然还可以设置其他几个状态位,但普通情况下,很少用到。还是以goodbit位用的最多。由于它是默认参数,所以不需显示传递,故而你最常看到的就是:
cin.clear() 这句了。
cin状态【转】
1、cin状态有下面几种:
常量 |
含义 |
failbit标记位的值 |
eofbit标记位的值 |
badbit标记位的值 |
转化为10进制 |
ios::failbit |
输入(输出)流出现非致命错误,可挽回 |
1 |
0 |
0 |
4 |
ios::badbit |
输入(输出)流出现致命错误,不可挽回 |
0 |
0 |
1 |
2 |
ios::eofbit |
已经到达文件尾 |
0 |
1 |
0 |
1 |
ios::goodbit |
流状态完全正常 |
0 |
0 |
0 |
0 |
分别对应cin.fail(),cin.bad(),cin.eof(),cin.good()
2、了解几种cin与状态有关的函数
(1)cin.sync() 清除缓冲区
(2)cin.clear() 清除cin错误状态
cin.clear()用法如果输入发生错误发生,那么流状态既被标记为错误,你 必须清除这些错误状态,以使你的程序能正确适当地继续运行。要清除错误状态,需使用clear()函数。
(3)cin.ignore(int n,char c)
cin.ignore( 5, 'c' ) 的是从输入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。每抛弃一个字符,它都要计数和比较字符:如果计数值达到5或者被抛弃的字符是'c',则cin.ignore() 函数执行终止;否则,它继续等待。
它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。
比如可以这么用:cin.ignore( 1024, '\n' );,通常把第一个参数设置得足够大,这样实际上总是只有第二个参数 '\n' 起作用,所以这一句就是把回车(包括回车)之前的所以字符从输入缓冲(流)中清除出去。