C++ stringstream與getline()


getline()的原型是istream& getline ( istream &is , string &str , char delim );

 

其中 istream &is 表示一個輸入流,譬如cin;string&str表示把從輸入流讀入的字符串存放在這個字符串中(可以自己隨便命名,str什么的都可以);

char delim表示遇到這個字符停止讀入,在不設置的情況下系統默認該字符為'\n',也就是回車換行符(遇到回車停止讀入)。

 

舉個例子:

 

string line;

cout<<"please cin a line:"

getline(cin,line,'#');

cout<<endl<<"The line you give is:"line;

 

那么當我輸入"You are the #best!" 的時候,輸入流實際上只讀入了"You are the ",#后面的並沒有存放到line中(應該是在緩沖區里吧)。

 

然后程序運行結果應該是這樣的:

 

please cin a line:You are the #best!

The line you give is:You are the 

 

而且這里把終止符設為#,你輸入的時候就算輸入幾個回車換行也沒關系,輸入流照樣會讀入,譬如

please cin a line:You are the best!

//這里輸入了一個回車換行

Thank you!

# //終止讀入

 

The line you give is:You are the best!

//換行照樣讀入並且輸出

Thank you!

 

 

 

那么如果把getline()作為while的判斷語句會怎么樣呢?

 

分析一下while(getline(cin,line))語句

 

注意這里默認回車符停止讀入,按Ctrl+Z或鍵入EOF回車即可退出循環。

 

在這個語句中,首先getline從標准輸入設備上讀入字符,然后返回給輸入流cin,注意了,是cin,所以while判斷語句的真實判斷對象是cin,也就是判斷當前是否存在有效的輸入流。

在這種情況下,我想只要你的電腦不中毒不發神經你的輸入流怎么會沒有效?所以這種情況下不管你怎么輸入都跳不出循環,因為你的輸入流有效,跳不出循環。

 

誤以為while判斷語句的判斷對象是line(也就是line是否為空),然后想通過直接回車(即輸入一個空的line)跳出循環,卻發現怎么也跳不出循環。這是因為回車只會終止getline()函數的讀入操作。getline()函數終止后又進行while()判斷(即判斷輸入流是否有效,你的輸入流當然有效,滿足條件)

 

 

 

C++ 使用 stringstream與getline()分割字符串

博客舉例非常清楚:

https://blog.csdn.net/qq_36743440/article/details/91999615

 

https://blog.csdn.net/weixin_39484422/article/details/89115883


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM