天天看點

簡短談談cin,scanf,getline的用法

      以前做題的時候,往往在一些輸入上很講究,但是當時對cin,scanf 和getline的用法不是很清楚,弄的束手無策,

結果去google,百度,講的也不是特别的詳細,經過自己的研究,終于弄懂了這些的用法,先上一道題吧,真是水題,這種就是在輸入上做文章

    題目: 輸入為字典對應,前面的是value,後面的是key,空一行,接着是查詢key,輸出為key所對應的value,

             如果不存在則輸出為eh。如圖。

簡短談談cin,scanf,getline的用法

這道題目還是比較簡單的,隻是對于輸入來說是個難點,因為不知道何時輸入結束,雖說空了一行,但是如果對于cin,scanf,getline等函數不熟的話,在寫代碼的時候會遇到很多問題,熟的話,幾分鐘搞定這道題。

      之是以我想寫這篇文章,是因為我看了一些百度文庫後發現裡面的講的并不是完全正确。

      先說說scanf吧,如果是讀字元的話,任何字元它都是會讀取的。看一個例子:

#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
int main() {
  int a, b;
  char c1, c2, c3;
  string str;
  scanf("%c%c%c",&c1, &c2, &c3);
  cout << c1 << c2 << c3;
  system("pause");
  return 0;
}
           
簡短談談cin,scanf,getline的用法

       我輸入的是 空格 + 1 + 回車 ,結果輸出的也是空格 + 1 + 回車,可見scanf讀取字元的時候是通吃的。

       cin.get()是讀取單個字元的和scanf讀取單個字元是完全一樣的,也是通吃型的。

       再說scanf讀取字元串的情況:

#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
int main() {
  int a, b;
  char c1, c2, c3;
  char str1[10], str2[10], str3[10];
  scanf("%s%s%s", str1, str2, str3);
  c1 = cin.get();
  cout << str1 << str2 << str3;
  cout << c1;
  system("pause");
  return 0;
}
           
簡短談談cin,scanf,getline的用法

 我輸入的是 空格 + 111 + 空格 + 222 + 空格 + 333 + 回車,結果輸出是  111222333+回車  ,這說明scanf讀取字元串的時候,從第一個非空白字元開始讀取,直到遇到空白字元結束,但是它并不會讀入空白字元,也就是說,最後的

的回車符他是沒讀取進去的也不會丢掉,結果用cin.get()讀取指派給了c1。

          cin讀取字元串的用法跟scanf讀取字元串的方式是一樣的。

         getline是讀取整行字元串的(開頭的空白字元也會照樣讀取),我們關心的是它到底有沒有讀取最後的換行符,來看一個例子:

#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
int main() {
  int a, b;
  char c1, c2, c3;
  string s;
  getline(cin,s);
  cout << s;
  c1 = cin.get();
  cout << c1;
  system("pause");
  return 0;
}
           
簡短談談cin,scanf,getline的用法

我輸入輸入  1111111 + 回車 結果是輸出  1111111  後面還在等待輸入(c1=cin.get() ),由此可知,換行符是被讀取掉了,并且丢掉了

      下面在說說讀取的機制,看到網上說有一段緩沖區,儲存着從鍵盤輸入的字元,那究竟從什麼時候cin,scanf這些從緩沖區讀取呢?答案應該是你輸入回車的時候。看看一個例子:

#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
int main() {
  string s;
  while (1) {
    cin >> s;
    cout << s;
  }
  system("pause");
  return 0;
}
           
簡短談談cin,scanf,getline的用法

我輸入的是 111 + 222 + 333 + 回車 接着它就輸出 111222333,我在輸入空格 + 4444 + 回車,它輸出 4444 ,由此證明觀點是正确的。

     說到這裡,我想第一題應該很容易就可以做出來了。

     總結一下:

scanf                               讀取單個字元的時候,是通吃型的,空白字元也會讀取;讀取字元串的時候,從第一個非空白字元讀起,遇到空白字元結束,不讀入空白字元
cin cin.get()和scanf讀取單個字元是一樣的,cin讀取單個字元時,從非空白字元讀起,遇到空白字元結束,不讀入空白字元;讀取字元串時,從非空白字元讀起,遇到空白字元結束,不讀入空白字元
getline 讀取整行的字元串,開頭的空白字元也會讀取,遇到行尾結束,行尾的回車符也會讀取掉,并且丢棄掉了

     以上純屬自己百度google之後,總結出來的經驗。有問題望大家提出。