[問題] getline 跟 cin

看板C_and_CPP作者 (~"~)時間14年前 (2011/05/01 11:54), 編輯推噓2(2021)
留言23則, 6人參與, 最新討論串1/1
開發平台(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

05/01 13:34, , 1F
cin 不會吃 white space, 當然就留給 getline 吃
05/01 13:34, 1F

05/01 15:16, , 2F
05/01 15:16, 2F

05/01 15:16, , 3F
有資格呼叫他
05/01 15:16, 3F

05/01 16:41, , 4F
看不懂0.0 回一樓 我的input沒有white space @@
05/01 16:41, 4F

05/01 16:48, , 5F
用 fgets()就好 XD
05/01 16:48, 5F

05/01 16:54, , 6F
white space 不只是空白
05/01 16:54, 6F

05/01 17:07, , 7F
所以就是\n 會被留在input buffer裡面嗎?
05/01 17:07, 7F

05/01 17:07, , 8F
那cin.ignore()為什麼又可以把\n 可砍掉呢@@??
05/01 17:07, 8F

05/01 17:08, , 9F
cin 不是不會看\n嗎XD
05/01 17:08, 9F

05/01 17:18, , 10F
http://ppt.cc/NBj5 看一下 ignore 在做什麼事吧..
05/01 17:18, 10F

05/01 17:30, , 11F
Extracts characters from the input sequence and
05/01 17:30, 11F

05/01 17:30, , 12F
discard them 可是妳說cin不會吃\n阿
05/01 17:30, 12F

05/01 17:31, , 13F
既然不會吃\n 為啥可以把它discard掉呢?
05/01 17:31, 13F

05/01 17:35, , 14F
1F的意思是cin不會把緩衝區的'\n'拿進來給std::string
05/01 17:35, 14F

05/01 17:36, , 15F
所以讀完裡面還有剩, getline 則是會把它去掉
05/01 17:36, 15F

05/01 17:38, , 16F
這我了解XD 但是不了解的是推文問的
05/01 17:38, 16F

05/01 17:38, , 17F
既然cin不會把緩衝區的\n吃進來 那又怎麼把它ignore?
05/01 17:38, 17F

05/01 17:41, , 18F
ignore做的事情就是把緩衝區的字元去掉, '\n'是字元所
05/01 17:41, 18F

05/01 17:42, , 19F
以會去掉, 不管是什麼內容, 格式化輸入時只有差在要不
05/01 17:42, 19F

05/01 17:42, , 20F
要拿進來存到變數裡而已
05/01 17:42, 20F

05/01 17:53, , 21F
謝謝你!
05/01 17:53, 21F

05/01 21:07, , 22F
love大正解
05/01 21:07, 22F

10/26 01:18, , 23F
謝謝你 我剛好遇到這個問題
10/26 01:18, 23F
文章代碼(AID): #1DlDbohg (C_and_CPP)