簡短談談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之後,總結出來的經驗。有問題望大家提出。