本文主要围绕几个常见的问题进行讲解,故涉及的基础知识讲解来源于网络
一、cin&cout 基础知识
相关基础知识可以参考这篇文章:
点击打开链接
二、两个常见问题
1. 输入一个完整句子/空格
在C++中,cin输入字符串时遇到空格、回车(“\r”会在输入时被转化为换行符”\n“)即会停止输入,
因此,常出现以下情况:
此时,即需要用到getline函数~
问题便能得到解决~
2. 输入类型错误导致cin错误
cin有四个bool类型的状态标识,绝大多数人都对它们感到陌生:
#include <iostream>
#include <string>
using namespace std;
int main(){
int a;
//正确输入
cin >> a;
cout << cin.bad(); //系统级错误(如流被破坏、不完整),一旦置位1,整个流便无法使用
cout << cin.eof(); //读取到EOF(文件终止符)置位1
cout << cin.fail(); //读取到EOF(文件终止符),或错误输入(int型变量输入字母等)置位1
cout << cin.good(); //可用状态置位1
cout << endl;
//错误输入
cin >> a;
cout << cin.bad(); //系统级错误(如流被破坏、不完整),一旦置位1,整个流便无法使用
cout << cin.eof(); //读取到EOF(文件终止符)置位1
cout << cin.fail(); //读取到EOF(文件终止符),或错误输入(int型变量输入字母等)置位1
cout << cin.good(); //可用状态置位1
return 0;
}
两种输入对比:
在命令行中输入Ctrl+Z模拟EOF:
了解到以上情况以后,再介绍两个相关函数:
cin.clear()以及cin.sync();
cin.clear():将错误置位恢复(不包括bad的情况);
cin.sync():清空流;
分析过程:
输入错误 -> failbit置1 -> 流中存有输入错误导致无法读入的输入内容 -> 无法正常使用cin
使用cin.clear() -> 重置failbit -> cin恢复正常 -> 使用cin.sync()清空流中原有的内容防止影响之后输入 -> 重新输入
#include <iostream>
#include <string>
using namespace std;
int main(){
int a;
//错误输入
cin >> a;
cout << cin.bad(); //系统级错误(如流被破坏、不完整),一旦置位1,整个流便无法使用
cout << cin.eof(); //读取到EOF(文件终止符)置位1
cout << cin.fail(); //读取到EOF(文件终止符),或错误输入(int型变量输入字母等)置位1
cout << cin.good(); //可用状态置位1
cout << endl;
//恢复
cin.clear(); //恢复cin.fail();
cin.sync(); //清空流
//重新输入
cin >> a;
cout << cin.bad(); //系统级错误(如流被破坏、不完整),一旦置位1,整个流便无法使用
cout << cin.eof(); //读取到EOF(文件终止符)置位1
cout << cin.fail(); //读取到EOF(文件终止符),或错误输入(int型变量输入字母等)置位1
cout << cin.good(); //可用状态置位1
cout << endl;
cout << a;
return 0;
}
错误输入修正:
EOF修正:
以上拙见浅薄,如有谬误还望大犇们批评指正!
//Szp 2018.5.2