cin是使用空白(空格,製表符,換行符)來確定字串的結束位置這意味著cin在獲取字元陣列時只讀取乙個單詞。讀取該單詞後cin自動在其結尾增加空字元。
這有時候很方便,有時候有使我們煩惱:如果我要輸入一句話來存入字串中呢?
要將整條短語而不是乙個單詞作為字串輸入,需要採用另一種字串讀取方法。
具體地說,需要採用面向行而不是面向單詞的方法。
istream的類cin提供了一些面向行的類成員函式:getline() and get()
這兩個函式都讀取一行輸入,直到遇到換行符為止。
不同的是getline()隨後將丟棄換行符,而get()將換行符保留在輸入序列中。
geiline的使用方法是cin.getline(char*, int)。
該函式有兩個引數,第乙個是你要儲存的目標,第二個是最多讀取多少位字元。如,若該引數為29,則最多讀取28個字元。餘下的空間是留給空字元的。
getline成員函式在讀取指定字元數或者遇到換行符時停止讀取。
注意,可以認為getline()讀取換行符,但隨後將換行符丟棄,換成空字元。
get成員函式有多重變體,其中有一種與getline相似,他們接受的引數個數相同,引數的解釋也相同,並且都讀取到行尾。
值得注意的是,get函式並不讀取並丟棄換行符,而是將其留在輸入序列中。這種特點如果不留意的話,會造成一些難以預料的麻煩。
下面舉個栗子,當我們連續兩次使用get():
cin.get(hobby, size);
第一次呼叫get()時,將換行符留在輸入佇列中,因此第二次呼叫時看到的第乙個字元便是換行符,因此第二個get函式會認為已經到達行尾,便不再讀取以下內容。
這個時候我們需要借助get函式的另一種變體,即不帶任何引數的get函式:cin.get(),它可以讀取下乙個字元,即使是換行符,因此可以用它來處理換行符。
它的呼叫形式可以是以下兩種:
//第一種:
cin.get(name, size);
cin.get();
cin.get(hobby, size);
cin.get();
//第二種:
cin.get(name, size).get();//之所以可以這樣做,是因為cin.get(name, size)返回乙個cin物件,
//這個物件隨後被用來訪問get成員函式。
cin.get(hobby, size).get();
char name[20];
cin >> year;
cin.getline(name, 20);
這種情況下name中儲存的不是我們輸入進去的字串,而是空字串。原因是cin在讀取year之後將換行符留在了輸入佇列,getline一開始就遇到換行符。
而我們以前連續呼叫cin不會產生讀取空字串的情況,是因為cin會自動忽略掉開頭的換行符。
另外再做一下說明:
getline(char*, int)成員函式和get(char*, int)成員函式不適合於c++的string類。
或者這麼說,適用於string類的getline函式並不是istream的成員函式,而是其友元函式,因此如果要讀取一行字串到string物件中,需要使用下面的格式:
getline(cin, str);
而get函式不適合於string類物件。
為什麼string類的物件搞特殊呢?這是歷史原因啦。
一種是接受乙個char型別作為引數:
cin.get(ch);
該函式返回乙個cin物件。
由於cin在需要的情況下可以轉為bool值,所以可以用cin.get(ch)函式來判斷輸入是否到達結尾:
cin.get(ch);
while (cin)
//或者採用更簡潔的表示:
while (cin.get(ch))
p.s.這裡的「輸入到達結尾」是指從鍵盤模擬的eof,windows下是ctrl + z + enter
另一種是
ch =cin.get();
while (ch != eof)
//或者採用更簡潔的表示:
while ((ch = cin.get()) != eof)
在希望逐字節地讀取文字檔案或文字輸入時,可以使用這兩個函式。
為什麼不是cin >> ? 因為cin將自動地忽略空格,換行符,製表符,有時候,我們並不期待這種事情的發生。
下面是這兩個函式的區別:
屬性
cin.get(ch)
ch = cin.get()
傳遞輸入字元的方式
賦給引數ch
將函式返回值賦給ch
用於字元輸入時函式的返回值
istream物件(執行bool轉換後為true)
int型別的字元編碼
到達eof時函式的返回值
istream物件(執行bool轉換後為false)
eof
另外,cin.get(ch)還有乙個好處就是它可以拼接起來,如:
cin.get(ch1).get(ch2);
最後,指出下列cin成員函式也可以判斷輸入是否到達結尾:
cin.fail()
cin.eof()
關於cin和scanf速度的問題
在leetcode最優解法中常常看到 int型別引數 static int x string型別引數 int some 查了一下發現是解決 cin,cout效率低的問題 cin cout之所以效率低,是因為先把要輸出的東西存入緩衝區,再輸出,導致效率降低,而這段語句可以來打消iostream的輸入 ...
C 關於cin的使用
注 以下為個人見解,有可能錯誤,歡迎批評指出!cin的常用形式 1.cin 2.cin.get 3.cin.getline 基礎 當呼叫cin函式時,會自動從鍵盤緩衝區的讀取資料 如果沒有就請求使用者輸入 在讀取的過程中,若先遇到space enter tab這些會自動忽略掉。cin的輸入是不是逐個...
C 關於vector的輸入和cin的聯絡
我還是見識短淺,學到現在為止,我並沒有見過vector還可以用cin去進行輸入的寫法 例子 vectorv1,v2 開闢一維陣列 v1.resize 100 v2.resize 100 for int i 0 i 6 i cin v1 i cin v2 i 為什麼不resize直接cin輸入程式會崩...