天天看點

【C++/C】【學習筆記】cin&cout! 基礎而重要的兩個小問題!一、cin&cout 基礎知識二、兩個常見問題

本文主要圍繞幾個常見的問題進行講解,故涉及的基礎知識講解來源于網絡

一、cin&cout 基礎知識

相關基礎知識可以參考這篇文章:

點選打開連結

二、兩個常見問題

1. 輸入一個完整句子/空格

在C++中,cin輸入字元串時遇到空格、回車(“\r”會在輸入時被轉化為換行符”\n“)即會停止輸入,

是以,常出現以下情況:

【C++/C】【學習筆記】cin&cout! 基礎而重要的兩個小問題!一、cin&cout 基礎知識二、兩個常見問題
【C++/C】【學習筆記】cin&cout! 基礎而重要的兩個小問題!一、cin&cout 基礎知識二、兩個常見問題

此時,即需要用到getline函數~

【C++/C】【學習筆記】cin&cout! 基礎而重要的兩個小問題!一、cin&cout 基礎知識二、兩個常見問題
【C++/C】【學習筆記】cin&cout! 基礎而重要的兩個小問題!一、cin&cout 基礎知識二、兩個常見問題

問題便能得到解決~

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;
}

           

兩種輸入對比:

【C++/C】【學習筆記】cin&amp;cout! 基礎而重要的兩個小問題!一、cin&amp;cout 基礎知識二、兩個常見問題

在指令行中輸入Ctrl+Z模拟EOF:

【C++/C】【學習筆記】cin&amp;cout! 基礎而重要的兩個小問題!一、cin&amp;cout 基礎知識二、兩個常見問題

了解到以上情況以後,再介紹兩個相關函數:

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;
}
           

錯誤輸入修正:

【C++/C】【學習筆記】cin&amp;cout! 基礎而重要的兩個小問題!一、cin&amp;cout 基礎知識二、兩個常見問題

EOF修正:

【C++/C】【學習筆記】cin&amp;cout! 基礎而重要的兩個小問題!一、cin&amp;cout 基礎知識二、兩個常見問題

以上拙見淺薄,如有謬誤還望大犇們批評指正!

//Szp 2018.5.2