最近在使用cin.get()函數時遇到了一個迷惑行爲,現已解開。函數
1、cin.get()的用法spa
char ch; ch = cin.get(); //第1種用法 cin.get(ch); //第2種用法
2、迷惑行爲解密code
當你前面調用過cin獲取輸入時,調用cin.get()函數不會等你等你在屏幕上手動再輸入一個字符,而是直接讀取 你上一次調用cin進行輸入時的 最後一個回車字符。blog
下面來看一下兩份不一樣的代碼和運行結果,兩份代碼的區別僅僅在第13行。ci
1 void test() { 2 char ch; 3 int todo = 1; 4 5 cout << "請輸入字符:"; 6 cin.get(ch); //前面未調用過cin,會在屏幕等待你輸入 7 cout << "輸入字符爲:" << ch << endl << endl; 8 9 cout << "輸入1繼續,輸入0結束:"; 10 cin >> todo; 11 while (todo) { 12 cout << "請輸入字符:"; 13 //cin.get(); 14 cin.get(ch); //前面調用過cin,此時不會等待你在屏幕上輸入,而是直接讀取上一次調用cin最後輸入的回車給ch 15 cout << "輸入字符爲:" << ch << endl << endl; 16 17 cout << "輸入1繼續,輸入0結束:"; 18 cin >> todo; 19 } 20 }
正常狀況下相鄰兩次循環輸出結果的間隔僅爲一個空行,可是從第2次循環開始間隔爲兩個空行,這是由於第14行代碼讀取了換行符並在下一行輸出。
1 void test() { 2 char ch; 3 int todo = 1; 4 5 cout << "請輸入字符:"; 6 cin.get(ch); //前面未調用過cin,會在屏幕等待你輸入 7 cout << "輸入字符爲:" << ch << endl << endl; 8 9 cout << "輸入1繼續,輸入0結束:"; 10 cin >> todo; 11 while (todo) { 12 cout << "請輸入字符:"; 13 cin.get(); //前面調用過cin,先用cin.get()吃掉上一次調用cin最後輸入的回車 14 cin.get(ch); //此時能夠正常輸入字符給ch 15 cout << "輸入字符爲:" << ch << endl << endl; 16 17 cout << "輸入1繼續,輸入0結束:"; 18 cin >> todo; 19 } 20 }
相鄰兩次循環輸出結果的間隔僅爲一個空行。