C++的get()函數與getline()函數應用詳解。本站提示廣大學習愛好者:(C++的get()函數與getline()函數應用詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C++的get()函數與getline()函數應用詳解正文
C++ get()函數讀入一個字符
get()函數是cin輸出流對象的成員函數,它有3種情勢:無參數的,有一個參數的,有3個參數的。
1) 不帶參數的get函數
其挪用情勢為
cin.get()
用來從指定的輸出流中提取一個字符(包含空白字符),函數的前往值就是讀入的字符。 若碰到輸出流中的文件停止符,則函數值前往文件停止標記EOF(End Of File),普通以-1代表EOF,用-1而不消0或正值,是斟酌到不與字符的ASCII代碼混雜,但分歧的C ++體系所用的EOF值有能夠分歧。
[例] 用get函數讀入字符。
#include <iostream> using namespace std; int main( ) { int c; cout<<"enter a sentence:"<<endl; while((c=cin.get())!=EOF) cout.put(c); return 0; }
運轉情形以下:
enter a sentence: I study C++ very hard.↙(輸出一行字符) I study C++ very hard. (輸入該行字符) ^Z↙(法式停止)
C說話中的getchar函數與流成員函數cin.get( )的功效雷同,C++保存了C的這類用法,可以用getchar(c)從鍵盤讀入一個字符賦給c。
2) 有一個參數的get函數
其挪用情勢為
cin.get(ch)
其感化是從輸出流中讀取一個字符,賦給字符變量ch。假如讀取勝利則函數前往true(真),如掉敗(遇文件停止符) 則函數前往false(假)。下面的例子可以改寫以下:
#include <iostream> using namespace std; int main( ) { char c; cout<<"enter a sentence:"<<endl; while(cin.get(c)) //讀取一個字符賦給字符變量c,假如讀取勝利,cin.get(c)為真 {cout.put(c);} cout<<"end"<<endl; return 0; }
3) 有3個參數的get函數
其挪用情勢為
cin.get(字符數組, 字符個數n, 終止字符)
或
cin.get(字符指針, 字符個數n, 終止字符)
其感化是從輸出流中讀取n-1個字符,賦給指定的字符數組(或字符指針指向的數組),假如在讀取n-1個字符之前碰到指定的終止字符,則提早停止讀取。假如讀取勝利則函數前往true(真),如掉敗(遇文件停止符) 則函數前往false(假)。再將例13.6改寫以下:
#include <iostream> using namespace std; int main( ) { char ch[20]; cout<<"enter a sentence:"<<endl; cin.get(ch,10,'\\n');//指定換行符為終止字符 cout<<ch<<endl; return 0; }
運轉情形以下:
enter a sentence: I study C++ very hard.↙ I study
在輸出流中有22個字符,但因為在get函數中指定的n為10,讀取n -1個(即9個)字符並賦給字符數組ch中前9個元素。有人能夠要問:指定n-10,為何只讀取9個字符呢?由於寄存的是一個字符串,是以在9個字符以後要參加一個字符串停止標記,現實上寄存到數組中的是10個字符。請讀者思慮:假如不參加字符串停止標記,會 湧現甚麼情形?成果是:在用“cout<<ch”;輸入數組中的字符時,不是輸入讀入的字符串,而是數組中的全體元素。年夜家可以親身測試一下ch[9](即數組中第10個元素)的值是甚麼。
假如輸出↙
abcde
即未讀完第9個字符就碰到終止字符、讀取操作終止,前5個字符已寄存到數組ch[0]到ch[4]中,ch[5]中寄存'\0'。
假如在get函數中指定的n為20,而輸出22個字符,則將輸出流中前19個字符賦給字符數組ch中前19個元素,再參加一個'\0'。
get函數中第3個參數可以省寫,此時默許為'\n'。上面兩行等價:
cin.get(ch,10,'\\n'); cin.get(ch,10);
終止字符也能夠用其他字符。如
cin.get(ch,10,'x');
在碰到字符'x'時停滯讀取操作。
C++ getline()函數讀入一行字符
getline函數的感化是從輸出流中讀取一行字符,其用法與帶3個參數的get函數相似。即
cin.getline(字符數組(或字符指針), 字符個數n, 終止標記字符)
[例] 用getline函數讀入一行字符。
#include <iostream> using namespace std; int main( ) { char ch[20]; cout<<"enter a sentence:"<<endl; cin>>ch; cout<<"The string read with cin is:"<<ch<<endl; cin.getline(ch,20,'/'); //讀個字符或遇'/'停止 cout<<"The second part is:"<<ch<<endl; cin.getline(ch,20); //讀個字符或遇'/n'停止 cout<<"The third part is:"<<ch<<endl; return 0; }
法式運轉情形以下:
enter a sentence: I like C++./I study C++./I am happy.↙ The string read with cin is:I The second part is: like C++. The third part is:I study C++./I am h
請細心剖析運轉成果。用“cin>>”從輸出流提取數據,遇空格就終止。是以只讀取 一個字符'I',寄存在字符數組元素ch[0]中,然後在ch[1]中寄存'\0'。是以用"cout<<ch"輸入時,只輸入一個字符'I'。然後用cin.getline(ch, 20, '/')從輸出流讀取19個字符 (或遇停止)。請留意:此時其實不是從輸出流的開首讀取數據。在輸出流中有一個字符指針,指向以後應拜訪的字符。在開端時,指針指向第一個字符,在讀入第一個字符'I'後,指針就移到下一個字符('I'前面的空格),所以getline函數從空格讀起,碰到就停滯,把字符串" like c++."寄存到ch[0]開端的10個數組元素中,然後用"cout<<ch"輸入這10個字符。留意:遇終止標記字符"/"時停滯讀取其實不放到數組中。再用cin.getline(ch, 20)讀19個字符(或遇'/n'停止),因為未指定以'/'為停止標記,所以第2個'/'被看成普通字符讀取,共讀入19個字符,最初輸入這19個字符。
有幾點解釋並請讀者思慮:
1) 假如第2個cin.getline函數也寫成cin. getline(ch, 20, '/''),輸入成果會若何? 此時最初一行的輸入為:
The third part is: I study C++.
2) 假如在用cin.getline(ch, 20, '/')從輸出流讀取數據時,碰到回車鍵("\n"),能否 停止讀取?結論是此時"\n"不是停止標記"\n"被作為一個字符被讀入。
3) 用getline函數從輸出流讀字符時,碰到終止標記字符時停止,指針移到該終止標記字符以後,下一個getline函數將從該終止標記的下一個字符開端接著讀入,如本法式運轉成果所示那樣。假如用cin.get函數從輸出流讀字符時,遇終止標記字符時停滯讀取,指針不向後挪動,依然逗留在原地位。下一次讀取時仍從該終止標記字符開端。這是getline函數和get函數分歧的地方。假設把例子法式中的兩個cin.line函數挪用都改成以下函數挪用:
cin.getline(ch, 20, '/');
則運轉成果為:
enter a sentence: I like C++./I study C++./I am happy.↙ The string read with cin is: I The second part is: like C++. The third part is: (沒有從輸人流中讀取有用字符)
第2個cin. getline(ch, 20, '/')從指針以後地位起讀取字符,碰到的第1個字符就是終止標記字符讀入停止,只把"\0"寄存到ch[0]中,所以用“cout<<ch”輸入時無字符輸入。
是以用get函數時要特殊留意,需要時用其他辦法跳過該終止標記字符(如用前面引見的ignore函數,概況請檢查:一些與輸出有關的istream類成員函數),但普通來講照樣用getline函數更便利。
4) 請比擬用“cin<<”和用成員函數cin.getline()讀數據的差別。用“cin<<”讀數據時以空白字符(包含空格、tab鍵、回車鍵)作為終止標記,而用cin.getline()讀數據時持續讀取一系列字符,可以包含空格。用“cin <<”可以讀取C++的尺度類型的各類型數據(假如經由重載,還可以用於輸出自界說類型的數據),而用cin.getline()只用於輸出字符型數據。