在用c++的getline函數的時候碰到兩個問題,總結如下:
1.有時候寫程序的時候我們會發現getline(cin,str);這樣的語句是不會執行,而是直接跳過的,
一般的解決方法是getline一句之前加cin.ignore()或者一句cin.get();,或者重復geiline
解釋:
認真檢查,在你寫getline()函數之前,一定有輸入過回車鍵,不論你輸入的是字符,數字或是回車,空格符,getline()函數都接收
而cin>>這種輸入方式卻是忽略回車的,如果你在getline()之前cin的一個數,回車被cin忽略了,卻被getline函數接收了,感覺就是這條語句被跳過了 所以解決的辦法是在getline函數之前再使用getline一次,將輸入流里的回車符接收掉,后面就能正常輸入了
比如這段代碼
int a
cout<<"請輸入a"<<endl;
cin>>a;
char *ch;
a=new char[a];
cout<<"請輸入字符串ch"<<endl;
cin.getline(ch,100);
你會發現cin.getline(ch,100);並沒有執行,因為cin>>a;后,你有一個回車鍵停留在緩沖區中了,當使用cin.getline(a,100);讀到這個回車符,就認為輸入結束了,所以,看起來沒有起作用。
應該是
cin>>a;
cin.get(); //加上這一句。
2.while(getline(cin,line))怎么也跳不出循環
在C++premer中,標准string類型第二小節就是“用getline讀取整行文本”。書上給的程序如下:
int main()
{
string line:
while(getline(cin,line))
cout<<line<<endl;
return 0;
}
大家會發現運行時怎么也跳不出循環,
讓我們一起來分析一下while(getline(cin,line))語句
注意這里默認回車符停止讀入,按Ctrl+Z或鍵入EOF回車即可退出循環。
在這個語句中,首先getline從標准輸入設備上讀入字符,然后返回給輸入流cin,注意看原型,返回類型是istream,在這個語句中對應的即是cin了,所以while判斷語句的真實判斷對象是cin,也就是判斷當前是否有有效的輸入流。在這種情況下,我想只要你的電腦不中毒不發神經你的輸入流怎么會沒有效?所以這種情況下不管你怎么輸入都跳不出循環,因為你的輸入流有效,跳不出循環。
然而有些同學誤以為while判斷語句的判斷對象是line(也就是line是否為空),然后想通過直接回車(即輸入一個空的line)跳出循環,卻發現怎么也跳不出循環。這是因為你的回車只會終止getline()函數的讀入操作。getline()函數終止后又進行while()判斷(即判斷輸入流是否有效,你的輸入流當然有效,滿足條件),所以又運行getline()函數。就這樣一次一次又一次的循環了~~~
