看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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:http://ppt.cc/W@OF http://ppt.cc/WArq 看懂說明你才 05/01 15:16
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
loveme00835:http://ppt.cc/NBj5 看一下 ignore 在做什麼事吧.. 05/01 17:18
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