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

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

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

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

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


這道題目還是比較簡單的,只是對於輸入來說是個難點,因爲不知道何時輸入結束,雖說空了一行,但是如果對於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;
}


   

       我輸入的是 空格 + 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;
}

 

 我輸入的是 空格 + 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;
}


我輸入輸入  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;
}

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

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

     總結一下:

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章