一、string中的getline不是string的成員函數,屬於全局函數,使用需要include<string>,有兩個重載版本:
函數原型參見:http://www.cplusplus.com/reference/istream/istream/getline/
標准信息來自《c++primer》和《c++ primer plus》,另http://blog.csdn.net/vanwaals/article/details/5753556
http://blog.csdn.net/mylovepan/article/details/7940719
istream& getline (istream& is, string& str, char delim);
istream& getline (istream& is, string& str);
這兩個getline讀取cin流里的字符串到str中,直到遇到下列情況結束,並返回:
(a)、遇到文件結束符,如windows下模擬的ctrl+z,或無效輸入
(b)、遇到換行符,即Enter,將換行符留在緩沖區中,留給下一個輸入,並不存入str中,所以輸出str,要自己添加endl來換行
(c)、遇到設備故障
如果第一個字符為換行符,getline也將結束,則str被置為空串。getline函數返回istream引用的對象,和cin一樣也可以用作condition(條件,即有真假的表達式)。
如果輸入的字符串過長呢,會大於str的存儲空間嗎?不會,str自動根據輸入來調整大小。如何結束while(getline(cin,str))循環呢?可以使用ctrl+z
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 int main() 5 { 6 string line; 7 while(getline(cin,line)) 8 cout<<line<<"$"; 9 }

輸入了三個字符串,每個用Enter結束輸入,且輸出沒有換行,getline()不會忽略space、tab,遇到Enter就結束,那么換行符是否留在緩沖區呢?如果是,下次getline就會遇到該換行符,
導致結束。由於沒有輸入ctrl+z,循環條件一直為真,所以提示繼續輸入
gteline的第三個參數為分界符,用戶可以自定義,任何有效的字符都可以,如#,默認的為Enter。
int main() { string s; while(getline(cin,s,'#')) cout<<s<<"$"; }
二、cin.getline,兩個重載版本:
istream& getline(char* s, streamsize n);
istream& getline(char* s, streamsize n, char delim);
第一個參數為字符指針,第二個控制輸入的最大字符(等於n-1,最后一個位置存'\0',以便把輸入存為字符串),如果輸入的字符串過長,會導致cin流狀態無效
不能再輸入,使用cin.clear()函數可以重設cin的狀態為有效。兩個函數讀取分界符或最大數目的字符為止。注意:將cin.getline()將分界符或者換行符丟棄,即緩沖區不會
有分界符用於下一個輸入。但是如果輸入的字符串過長,余下的字符會留在緩沖區。
int main() { char c[4]; cin.getline(c, 4); cout << c; }
輸入超過了4個字符,存入c的只有三個字符
1 int main() 2 { 3 char c[4]; 4 cin.getline(c, 4); 5 cout << c; 6 if (!cin) cout << "cin error" << endl; 7 cin.getline(c, 3); 8 }
cin狀態已經無效,!cin為測試條件。所以下一條輸入語句不執行,不再有輸入提示。
int main() { char c[4]; cin.getline(c, 4); cout << c; if (!cin) cout << "cin error" << endl; cin.clear(); cin.sync(); cin.getline(c, 3); cout << c << endl; }
h
使用cin.clear()與cin.sync()(清空緩沖區),才可以繼續輸入“123”,由於n=3,只能讀取2個字符。
三、cin.get():
istream& get(char *,int,char); istream& get(char*,int);
用於單字符輸入的 istream& get(char&);int get();
這是個函數都是istream類的方法,需要對象cin才能調用,與string中的getline()不同。
cin.get()與cin.getline()的不同之處為:遇到換行符或分界符,get會留該字符在緩沖區,所以cin.get()的連續兩次調用,后一次會讀取緩沖區的字符,不會再請求輸入。
char c[6]; char a[6]; cin.get(c,5); cin.get(a,4);
這樣cin.get()無法跨行輸入,解決辦法是使用get的變體,下面介紹兩個新get函數:
istream &get(char&);int get();
第二個函數與c的庫函數getchar()一樣,可以替換后者;它的使用代碼為:
char ch; ch=cin.get(); while(ch !='\n') { cout<<ch; ch=cin.get(); }
這兩個get都用於單字符的輸入,且space,tab,Enter都能輸入。通過在cin.get(c,5)與cin.get(a,4)間插入cin.get()這條語句,讀取了緩沖區的換行符,cin.get(a,4)
才能繼續讀取輸入。
istream &get(char&)的使用方式為 char ch; cin.get(ch);由於返回的是istream對象,所以cinget(ch).get(ch2)>>c3運行正常。也可以用cin.get(ch)為循環的測試條件。
四、cin的特點
cin用於輸入int ,char ,string 等基本類型,不能輸入一行字符到str中。cin遇到space,tab,Enter會自動忽略,從緩沖區中丟棄,但是后續的輸入會留在緩沖區,下一次的輸入會直接從緩沖區讀取數據。
int sum=0; int n; while(cin>>n,n!=20) { sum+=n; } cout<<sum<<endl;
換行輸入space后又輸入6,3,4,但是循環無法結束,此時輸入20可以結束。
1+2+3+4+5+6+3+4=28。注意:while(cin>>a,a!=20)的測試條件是逗號表達式,值為逗號右邊的子表達式,而不是cin>>a的返回值cin。
注意:如果int a;cin>>a;輸入的不是整數,cin>>a是無效輸入,不能再輸入。