【轉】C++輸入cin詳解


C++輸入cin詳解

0.cin輸入原理

  程序的輸入都建有一個緩沖區,即輸入緩沖區。一次輸入過程是這樣的,當一次鍵盤輸入結束時會將輸入的數據存入輸入緩沖區,而cin函數直接從輸入緩沖區中取數據。正因為cin函數是直接從緩沖區取數據的,所以有時候當緩沖區中有殘留數據時,cin函數會直接取得這些殘留數據而不會請求鍵盤輸入。

  注意:cin>>和cin.get()都殘留數據不會出錯,但是cin.getline會報錯,下面的示例中都有體現。

1.cin>>

  存儲變量類型:char,int,string都可以;

  輸入結束條件:遇到Enter、Space和Tab鍵。

  對結束符處理:丟棄緩沖區中使得輸入結束的結束符(Enter、Space和Tab)。

  示例:

 1 #include <iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     char str1[10], str2[10];
 6     cin >> str1;
 7     cin >> str2;
 8     cout << str1 << endl;
 9     cout << str2 << endl;
10     system("pause");
11     return 0;
12 }

  輸入:abcd[空格]efgh,輸出結果:

  【分析】第一次讀取字符串時遇到空格則停止了,將abcd讀入str1,並舍棄了空格,將后面的字符串給了第二個字符串。這證明了cin讀入數據遇到空格結束;並且丟棄空格符;緩沖區有殘留數據,讀入操作直接從緩沖區中取數據。

2.cin.get()

  2.1讀取字符的情況

  存儲變量類型:char。

  輸入結束條件:Enter鍵(因此可接受空格和Tab鍵)。

  對結束符處理:不丟棄緩沖區中的Enter。

  使用方法:ch=cin.get()  或  cin.get(ch)。

  示例:

 1 #include <iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     char c1, c2;
 6     cin.get(c1);
 7     cin.get(c2);
 8     cout << c1 << " " << c2 << endl; // 打印兩個字符
 9     cout << (int)c1 << " " << (int)c2 << endl; // 打印這兩個字符的ASCII值
10     system("pause");
11     return 0;
12 }

  輸入:a[回車],輸出結果:

  【分析】會發現只執行了一次從鍵盤輸入,顯然第一個字符變量取的’a', 第二個變量取的是Enter(ASCII值為10),這是因為該函數不丟棄上次輸入結束時的Enter字符,所以第一次輸入結束時緩沖區中殘留的是上次輸入結束時的Enter字符!

  輸入:a[空格]b[回車],輸出結果:

  【分析】顯然第一個字符變量取的’a', 第二個變量取的是Space(ASCII值為32)。原因同上,沒有丟棄Space字符。

  2.2讀取字符串的情況

  存儲變量類型:char數組。

  輸入結束條件:默認Enter(因此可接受空格和Tab鍵),自定義結束符(第三參數上配置)。

  對結束符處理:丟棄緩沖區中的Enter。

  使用方法:cin.get(數組名,長度,結束符)。

  示例:

 1 #include <iostream>
 2 using namespace std;
 3 int main ()
 4 {
 5   char ch, a[20];
 6   cin.get(a, 5 , 'd');
 7   cin>>ch;
 8   cout<<a<<endl;
 9   cout<<(int)ch<<endl;
10   return 0;
11 }

  輸入:12345[回車],輸出結果:

  【分析】第一次輸入超長,字符串按長度取了"1234",而’5′仍殘留在緩沖區中,所以第二次輸入字符沒有從鍵盤讀入,而是直接取了’5′,所以打印的ASCII值是53(’5′的ASCII值)。

  輸入:12d45[回車],輸出結果:

  【分析】第二次輸出為100(‘d’的ASCII值),說明自定義結束符時不丟棄緩沖區中的結束符。

3.cin.getline()

  cin.getline(數組名,長度,結束符) 大體與 cin.get(數組名,長度,結束符)類似。
  區別在於:
  cin.get()當輸入的字符串超長時,不會引起cin函數的錯誤,后面的cin操作會繼續執行,只是直接從緩沖區中取數據。但是cin.getline()當輸入超長時,會引起cin函數的錯誤,后面的cin操作將不再執行。

  示例: 

 1 #include <iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     char ch, a[20];
 6     cin.getline(a, 5);
 7     cin >> ch;
 8     cout << a << endl;
 9     cout << (int)ch << endl;
10     system("pause");
11     return 0;
12 }

   輸入:12345[回車],輸出結果:

  【分析】與cin.get()的例子比較會發現,這里的ch並沒有讀取緩沖區中的5,而是返回了-52,這里其實cin>>ch語句沒有執行,是因為cin出錯了!cin的錯誤處理下次介紹。 

 

——如有不對的地方,非常歡迎給予指導!

——【感謝】資料來源於http://www.cnblogs.com/A-Song/archive/2012/01/29/2331204.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM