作者singlovesong (~"~)
看板C_and_CPP
標題[問題] getline 跟 cin
時間Sun May 1 11:54:24 2011
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
Linux g++
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
#include <iostream>
問題(Question):
不了解getline 跟 cin 的行為差別
程式碼(Code):(請善用置底文網頁, 記得排版)
#include <iostream>
using namespace std;
int main(){
string test1;
string test2;
cin >> test1;
getline(cin,test2);
cout << test1 << endl << test2 << endl;
}
小弟我寫這樣的話 假設餵入 TestString 一次
那麼輸出會是
TestString
\n
它不會等我餵下一行給getline這個function 就直接結束掉了
而如果在cin >> test1 跟 getline(cin,test2)
中間加入了 cin.ignore(); 就會等我了
--------------------------我是分隔線---------------------------------
另外一個程式是
#include <iostream>
using namespace std;
int main(){
string test1;
string test2;
getline(cin,test1);
getline(cin,test2);
cout << test1 << endl << test2 << endl;
}
在第一次輸入TestString 之後 它就直接會等我再輸入下一個string 這樣
小弟的問題來了
1.
cin >> 這個method 的行為還是不是很了解
cin >> 參數a 這行做完之後 緩衝區裡面到底會不會有東西呢?
如果會的話 上面第一個case 可以解釋
但是為什麼像是 cin >> int a >> int b ; 這樣的東西就不會出錯?
就可以讓使用者輸入兩個int 參數
(cin >> int a
=> 歡衝區裡面還有a的值 應該會直接餵給b嗎!?)
2.
cin >> 跟 getline 回傳的參數跟傳入的參數都是參考型態(&)
為什麼兩個的行為會不一樣阿?
以上面兩分code的例子來看
感覺像是cin 不會自動把緩衝區清掉 導致getline吃到緩衝區裡面剩下來的東西
getline 卻在讀入一次結束後 會自動把緩衝區清掉嗎?
不知道這樣問夠不夠清楚@@
基本上就是想知道為什麼上面兩分code行為會不一樣就是了XD
謝謝大家
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.244.131
推 legnaleurc:cin 不會吃 white space, 當然就留給 getline 吃 05/01 13:34
→ loveme00835:有資格呼叫他 05/01 15:16
→ singlovesong:看不懂0.0 回一樓 我的input沒有white space @@ 05/01 16:41
→ abzxcx:用 fgets()就好 XD 05/01 16:48
→ loveme00835:white space 不只是空白 05/01 16:54
→ singlovesong:所以就是\n 會被留在input buffer裡面嗎? 05/01 17:07
→ singlovesong:那cin.ignore()為什麼又可以把\n 可砍掉呢@@?? 05/01 17:07
→ singlovesong:cin 不是不會看\n嗎XD 05/01 17:08
→ singlovesong:Extracts characters from the input sequence and 05/01 17:30
→ singlovesong:discard them 可是妳說cin不會吃\n阿 05/01 17:30
→ singlovesong:既然不會吃\n 為啥可以把它discard掉呢? 05/01 17:31
→ loveme00835:1F的意思是cin不會把緩衝區的'\n'拿進來給std::string 05/01 17:35
→ loveme00835:所以讀完裡面還有剩, getline 則是會把它去掉 05/01 17:36
→ singlovesong:這我了解XD 但是不了解的是推文問的 05/01 17:38
→ singlovesong:既然cin不會把緩衝區的\n吃進來 那又怎麼把它ignore? 05/01 17:38
→ loveme00835:ignore做的事情就是把緩衝區的字元去掉, '\n'是字元所 05/01 17:41
→ loveme00835:以會去掉, 不管是什麼內容, 格式化輸入時只有差在要不 05/01 17:42
→ loveme00835:要拿進來存到變數裡而已 05/01 17:42
→ singlovesong:謝謝你! 05/01 17:53
→ tomap41017:love大正解 05/01 21:07
推 devil115789:謝謝你 我剛好遇到這個問題 10/26 01:18