本文主要圍繞幾個常見的問題進行講解,故涉及的基礎知識講解來源于網絡
一、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