cin、cin.get()、cin.getline()、getline()總結

前言

總結一波cin的詳細用法

正文

cin介紹

cin 是 C++ 的標準輸入流對象,即 istream 類的對象。cin 主要用於從標準輸入讀取數據,這裏的標準輸入,指的是終端的鍵盤。此外,cout 是輸出流對象,即 ostream 類的對象,cerr 是標準錯誤輸出流的對象,也是 ostream 類的對象。這裏的標準輸出指的是終端的屏幕。

在理解cin功能時,不得不提標準輸入緩衝區。當我們從鍵盤輸入字符串的時候需要敲一下回車鍵才能夠將這個字符串送入到緩衝區中,那麼敲入的這個回車鍵(\r)會被轉換爲一個換行符\n,這個換行符\n也會被存儲在cin的緩衝區中並且被當成一個字符來計算!比如我們在鍵盤上敲下了123456這個字符串,然後敲一下回車鍵(\r)將這個字符串送入了緩衝區中,那麼此時緩衝區中的字節個數是7 ,而不是6。

cin讀取數據也是從緩衝區中獲取數據,緩衝區爲空時,cin的成員函數會阻塞等待數據的到來,一旦緩衝區中有數據,就觸發cin的成員函數去讀取數據。

1.cin>>

cin可以連續從鍵盤讀取想要的數據,以空格、tab或換行作爲分隔符,即碰到分隔符,表示一個輸入的結束。當cin>>從緩衝區中讀取數據時,若緩衝區中第一個字符是空格、tab或換行這些分隔符時,cin>>會將其忽略並清除,繼續讀取下一個字符,若緩衝區爲空,則繼續等待。但是如果讀取成功,字符後面的分隔符是殘留在緩衝區的,cin>>不做處理。

int a,b;
string c;
cin>>a>>b;
cin>>c;

輸入是1[enter]2[enter]a[enter],則a=1.b=2,c=a;輸入是[enter][enter]1[enter]2a,則a=1,b=2,c=a;其中cin>>自動忽略了一開始的分隔符,直到遇到值賦給a,而且往後也是cin>>,只是寫成了連續賦值的形式,所以b之前的分隔符也被忽略了。而且如果輸入是1[enter]a[enter]因爲輸入a和定義的int型b類型不符,所以不會賦值成功。

爲什麼說cin>>對字符後面的殘留在緩衝區的分隔符不做處理呢,我們可以驗證下,後面會說到cin.getline()讀取數據時,並非像cin>>那樣忽略第一個換行符,getline()發現cin的緩衝區中有一個殘留的換行符,不阻塞請求鍵盤輸入,直接讀取,送入目標字符串後,再將換行符替換爲空字符’\0’

int a;
string b;
cin>>a>>b;
cout<<a<<b;
//第二種
cin>>a;
getline(cin,b);
cout<<a<<b

輸入:1[enter]hello[enter] 如果是用cin>>a>>b輸入的話,這樣兩個>>都會忽略字符前的分隔符的,結果爲a=1,b=“hello”,但是如果是第二個輸入的方式,則getline不會將1後面的[enter]忽略掉,它會將其讀取到b中,因爲是換行符,所以替換成’\0’,代表結束,則hello會被屏蔽,但是依然存放在緩衝區裏,這個時候再來一個getline,纔會讀取還在緩衝區中的b。

2.cin.get()

cin.get()從輸入緩衝區讀取單個字符時不忽略分隔符,直接將其讀取cin.get()的返回值是int類型,成功:讀取字符的ASCII碼值,遇到文件結束符時,返回EOF,即-1,Windows下標準輸入輸入文件結束符爲Ctrl+z,Linux爲Ctrl+d。cin.get(char var)如果成功返回的是cin對象,因此可以支持鏈式操作,如cin.get(b).get(c)。

char a,b;
a=cin.get();
cin.get(b);

輸入e[enter],這樣a=e,b=[enter],因爲get不忽略分隔符。

同時cin.get()還可以讀取一行

char a;
char array[20]; 
cin.get(array,20);
cin.get(a);
cout<<array<<" "<<a<<endl;

輸入:12345[enter] 輸出:array=12345,a=[enter];讀取一行時,遇到換行符時結束讀取,但是不對換行符進行處理,換行符仍然殘留在輸入緩衝區。第二次由cin.get()將換行符讀入變量a,換行符的ASCII碼值爲10。這也是cin.get()讀取一行與使用getline讀取一行的區別所在。getline讀取一行字符時,默認遇到’\n’時終止,並且將’\n’直接從輸入緩衝區中刪除掉,不會影響下面的輸入處理。

cin.get(str,size);讀取一行時,只能將字符串讀入C風格的字符串中,即char*,但是C++的getline函數可以將字符串讀入C++風格的字符串中,即string類型。鑑於getline較cin.get()的這兩種優點,建議使用getline對一行進行讀取。

3.cin.getline()

cin.getline(),從標準輸入設備鍵盤讀取一串字符串,並以指定的結束符結束,一般爲字符數組賦值。cin.getline()實際上有三個參數,cin.getline(接受字符串的字符串地址,接受個數,結束字符) ,當第三個參數省略時,系統默認爲’\0’

#include <iostream>
using namespace std;

int main()
{
	char array[20];
	cin.getline(array,7); 
	//或者指定結束符
	//cin.getline(array,7,'\n');
	cout<<array<<endl;
	return 0;
}

在這裏插入圖片描述
因爲讀入七個字符,字符串結尾’\0’需要佔一位,因此輸出爲123[空格]45。
cin.getline()與cin.get()的區別是,cin.getline不會將結束符或者換行符殘留在輸入緩衝區中。

4.getline()

#include <string> 
#include <iostream>
using namespace std;
int main()
{
	string str;
	getline(cin,str);
	cout << str << endl;
	return 0;
}

在這裏插入圖片描述
cin.getline() 與 getline() 類似,但是因爲 cin.getline() 的輸出是char*,getline() 的輸出是 string,所以 cin.getline() 屬於 istream 流,而 getline() 屬於 string 流,二者是不一樣的函數

參考鏈接
https://www.cnblogs.com/mini-coconut/p/9041925.html
https://www.cnblogs.com/flatfoosie/archive/2010/12/22/1914055.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章