C++的get()函數(shù)與getline()函數(shù)使用詳解
C++ get()函數(shù)讀入一個字符
get()函數(shù)是cin輸入流對象的成員函數(shù),它有3種形式:無參數(shù)的,有一個參數(shù)的,有3個參數(shù)的。
1) 不帶參數(shù)的get函數(shù)
其調(diào)用形式為
cin.get()
用來從指定的輸入流中提取一個字符(包括空白字符),函數(shù)的返回值就是讀入的字符。 若遇到輸入流中的文件結(jié)束符,則函數(shù)值返回文件結(jié)束標(biāo)志EOF(End Of File),一般以-1代表EOF,用-1而不用0或正值,是考慮到不與字符的ASCII代碼混淆,但不同的C ++系統(tǒng)所用的EOF值有可能不同。
[例] 用get函數(shù)讀入字符。
#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↙(程序結(jié)束)
C語言中的getchar函數(shù)與流成員函數(shù)cin.get( )的功能相同,C++保留了C的這種用法,可以用getchar(c)從鍵盤讀入一個字符賦給c。
2) 有一個參數(shù)的get函數(shù)
其調(diào)用形式為
cin.get(ch)
其作用是從輸入流中讀取一個字符,賦給字符變量ch。如果讀取成功則函數(shù)返回true(真),如失敗(遇文件結(jié)束符) 則函數(shù)返回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個參數(shù)的get函數(shù)
其調(diào)用形式為
cin.get(字符數(shù)組, 字符個數(shù)n, 終止字符)
或
cin.get(字符指針, 字符個數(shù)n, 終止字符)
其作用是從輸入流中讀取n-1個字符,賦給指定的字符數(shù)組(或字符指針指向的數(shù)組),如果在讀取n-1個字符之前遇到指定的終止字符,則提前結(jié)束讀取。如果讀取成功則函數(shù)返回true(真),如失敗(遇文件結(jié)束符) 則函數(shù)返回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函數(shù)中指定的n為10,讀取n -1個(即9個)字符并賦給字符數(shù)組ch中前9個元素。有人可能要問:指定n-10,為什么只讀取9個字符呢?因為存放的是一個字符串,因此在9個字符之后要加入一個字符串結(jié)束標(biāo)志,實際上存放到數(shù)組中的是10個字符。請讀者思考:如果不加入字符串結(jié)束標(biāo)志,會 出現(xiàn)什么情況?結(jié)果是:在用“cout<<ch”;輸出數(shù)組中的字符時,不是輸出讀入的字符串,而是數(shù)組中的全部元素。大家可以親自測試一下ch[9](即數(shù)組中第10個元素)的值是什么。
如果輸入↙
abcde
即未讀完第9個字符就遇到終止字符、讀取操作終止,前5個字符已存放到數(shù)組ch[0]到ch[4]中,ch[5]中存放'\0'。
如果在get函數(shù)中指定的n為20,而輸入22個字符,則將輸入流中前19個字符賦給字符數(shù)組ch中前19個元素,再加入一個'\0'。
get函數(shù)中第3個參數(shù)可以省寫,此時默認(rèn)為'\n'。下面兩行等價:
cin.get(ch,10,'\\n'); cin.get(ch,10);
終止字符也可以用其他字符。如
cin.get(ch,10,'x');
在遇到字符'x'時停止讀取操作。
C++ getline()函數(shù)讀入一行字符
getline函數(shù)的作用是從輸入流中讀取一行字符,其用法與帶3個參數(shù)的get函數(shù)類似。即
cin.getline(字符數(shù)組(或字符指針), 字符個數(shù)n, 終止標(biāo)志字符)
[例] 用getline函數(shù)讀入一行字符。
#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,'/'); //讀個字符或遇'/'結(jié)束 cout<<"The second part is:"<<ch<<endl; cin.getline(ch,20); //讀個字符或遇'/n'結(jié)束 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
請仔細(xì)分析運行結(jié)果。用“cin>>”從輸入流提取數(shù)據(jù),遇空格就終止。因此只讀取 一個字符'I',存放在字符數(shù)組元素ch[0]中,然后在ch[1]中存放'\0'。因此用"cout<<ch"輸出時,只輸出一個字符'I'。然后用cin.getline(ch, 20, '/')從輸入流讀取19個字符 (或遇結(jié)束)。請注意:此時并不是從輸入流的開頭讀取數(shù)據(jù)。在輸入流中有一個字符指針,指向當(dāng)前應(yīng)訪問的字符。在開始時,指針指向第一個字符,在讀入第一個字符'I'后,指針就移到下一個字符('I'后面的空格),所以getline函數(shù)從空格讀起,遇到就停止,把字符串" like c++."存放到ch[0]開始的10個數(shù)組元素中,然后用"cout<<ch"輸出這10個字符。注意:遇終止標(biāo)志字符"/"時停止讀取并不放到數(shù)組中。再用cin.getline(ch, 20)讀19個字符(或遇'/n'結(jié)束),由于未指定以'/'為結(jié)束標(biāo)志,所以第2個'/'被當(dāng)作一般字符讀取,共讀入19個字符,最后輸出這19個字符。
有幾點說明并請讀者思考:
1) 如果第2個cin.getline函數(shù)也寫成cin. getline(ch, 20, '/''),輸出結(jié)果會如何? 此時最后一行的輸出為:
The third part is: I study C++.
2) 如果在用cin.getline(ch, 20, '/')從輸入流讀取數(shù)據(jù)時,遇到回車鍵("\n"),是否 結(jié)束讀?。拷Y(jié)論是此時"\n"不是結(jié)束標(biāo)志"\n"被作為一個字符被讀入。
3) 用getline函數(shù)從輸入流讀字符時,遇到終止標(biāo)志字符時結(jié)束,指針移到該終止標(biāo)志字符之后,下一個getline函數(shù)將從該終止標(biāo)志的下一個字符開始接著讀入,如本程序運行結(jié)果所示那樣。如果用cin.get函數(shù)從輸入流讀字符時,遇終止標(biāo)志字符時停止讀取,指針不向后移動,仍然停留在原位置。下一次讀取時仍從該終止標(biāo)志字符開始。這是getline函數(shù)和get函數(shù)不同之處。假如把例子程序中的兩個cin.line函數(shù)調(diào)用都改為以下函數(shù)調(diào)用:
cin.getline(ch, 20, '/');
則運行結(jié)果為:
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, '/')從指針當(dāng)前位置起讀取字符,遇到的第1個字符就是終止標(biāo)志字符讀入結(jié)束,只把"\0"存放到ch[0]中,所以用“cout<<ch”輸出時無字符輸出。
因此用get函數(shù)時要特別注意,必要時用其他方法跳過該終止標(biāo)志字符(如用后面介紹的ignore函數(shù),詳情請查看:一些與輸入有關(guān)的istream類成員函數(shù)),但一般來說還是用getline函數(shù)更方便。
4) 請比較用“cin<<”和用成員函數(shù)cin.getline()讀數(shù)據(jù)的區(qū)別。用“cin<<”讀數(shù)據(jù)時以空白字符(包括空格、tab鍵、回車鍵)作為終止標(biāo)志,而用cin.getline()讀數(shù)據(jù)時連續(xù)讀取一系列字符,可以包括空格。用“cin <<”可以讀取C++的標(biāo)準(zhǔn)類型的各類型數(shù)據(jù)(如果經(jīng)過重載,還可以用于輸入自定義類型的數(shù)據(jù)),而用cin.getline()只用于輸入字符型數(shù)據(jù)。
欄 目:C語言
本文標(biāo)題:C++的get()函數(shù)與getline()函數(shù)使用詳解
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2683.html
您可能感興趣的文章
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對數(shù)怎么表達(dá)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 01-10c語言求1+2+...+n的解決方法
- 01-10求子數(shù)組最大和的解決方法詳解
- 01-10深入理解約瑟夫環(huán)的數(shù)學(xué)優(yōu)化方法
- 01-10深入二叉樹兩個結(jié)點的最低共同父結(jié)點的詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計- 解析最少換車次數(shù)的問題詳解
- 01-10c語言 跳臺階問題的解決方法


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10C#中split用法實例總結(jié)