getline函數的作用是從輸入流中讀取一行字符,其用法與帶3個參數的get函數類似。即
cin.getline(字符數組(或字符指針), 字符個數n, 終止標志字符)
[例13.7] 用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函數不同之處。假如把例13.7程序中的兩個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()只用於輸入字符型數據。
C++:cin、cin.getline()、getline()的用法
主要內容:
1、cin用法
2、cin.getline()用法
3、getline()用法
3、注意的問題
一、cin>>
用法1:輸入一個數字或字符
#include <iostream>
using namespace std;
main ()
{
int a,b;
cin>>a>>b;
cout<<a+b<<endl;
}
用法2:接收一個字符串,遇“空格”、“TAB”、“回車”就結束
#include <iostream>
using namespace std;
main ()
{
char a[20];
cin>>a;
cout<<a<<endl;
}
輸入:jkljkljkl
輸出:jkljkljkl
輸入:jkljkl jkljkl //遇空格結束
輸出:jkljkl
二、cin.getline()
用法:接收一個字符串,可以接收空格並輸出
#include <iostream>
using namespace std;
main ()
{
char m[20];
cin.getline(m,5);
cout<<m<<endl;
}
輸入:jkljkljkl
輸出:jklj
接收5個字符到m中,其中最后一個為'\0',所以只看到4個字符輸出;
如果把5改成20:
輸入:jkljkljkl
輸出:jkljkljkl
輸入:jklf fjlsjf fjsdklf
輸出:jklf fjlsjf fjsdklf
延伸:
1、cin.getline()實際上有三個參數,cin.getline(接收字符串的變量,接收字符個數,結束字符)
2、當第三個參數省略時,系統默認為'\0'
3、如果將例子中cin.getline()改為cin.getline(m,5,'a');當輸入jlkjkljkl時輸出jklj,輸入jkaljkljkl時,輸出jk
三、getline()
用法:接收一個字符串,可以接收空格並輸出,需包含“#include<string>”
#include<iostream>
#include<string>
using namespace std;
main ()
{
string str;
getline(cin,str);
cout<<str<<endl;
}
輸入:jkljkljkl
輸出:jkljkljkl
輸入:jkl jfksldfj jklsjfl
輸出:jkl jfksldfj jklsjfl
四、注意的問題
1、cin.getline()屬於istream流,而getline()屬於string流,是不一樣的兩個函數
2、當同時使用cin>>,getline()時,需要注意的是,在cin>>輸入流完成之后,getline()之前,需要通過
str="\n";
getline(cin,str);
的方式將回車符作為輸入流cin以清除緩存,如果不這樣做的話,在控制台上就不會出現getline()的輸入提示,而直接跳過,因為程序默認地將之前的變量作為輸入流。
看下面一段程序:
/*-------------Basic Input/Output-------------*/
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main(){
int age;
//standard input(cin)
cout<<"Please enter an integer value as your age: ";
cin>>age;
cout<<"Your ager is: "<<age<<".\n";
//cin and string
string mystr;
cout<<"What's your name? "<<endl;
mystr="\n";
getline(cin,mystr);
getline(cin,mystr);
cout<<"Hello,"<<mystr<<".\n";
char sex;
cout<<"Please enter a F or M as your sex: ";
cin>>sex;
cout<<"Your sex is: "<<sex<<endl;
cout<<"What's your favorite team? ";
mystr="\n";
getline(cin,mystr);
getline(cin,mystr);
cout<<"I like "<<mystr<<".\n";
system("pause");
return 0;
}
運行結果為:
如果不添加紅色代碼,則運行結果為:
五、參考文獻
http://www.cnblogs.com/flatfoosie/archive/2010/12/22/1914055.html