C++中清空緩沖區


C++中標准輸入cin有多種輸入方式。。

這篇文章羅列的還是簡要易懂的。C++輸入cin詳解。。。如果只是簡單的使用cin>>的話,會單個token的讀入。但是會忽略換行符,空格,制表符等空白符。其中cin.getline()和cin.get()都會遇到一個非常棘手的事情,就是當輸入的字符串,或者說緩沖區中的字符多於第二個參數int的要求時。緩沖區中殘余的字符串怎么處理

        1. cin>>

          cin>> var,只會忽略空白符,按照參數var的格式,讀入一個合法的字符串。剩下的字符就殘留在緩沖區中,不會影響任何狀態。下一次就接着上一次讀取的位置開始讀取緩沖區。

          對於代碼

          int n;
          cin >> n;

          很可能發生的情況是,用戶輸入的是單詞,不是數字。對於這種類型不匹配的情況,將采取如下措施:

          • n的值不發生變化
          • 不匹配的輸入將留在輸入隊列(緩沖區)中
          • cin對象中的一個錯誤標記被設置
          • 對cin方法的調用將返回false。(對於需要被轉換為bool的類型)

          隨后,無法再調用cin進行輸入。程序員應采取下述3個措施進行錯誤處理:

          1. 重置cin以接收新的輸入
          2. 刪除錯誤輸入
          3. 提示用戶輸入

          1和2的步驟不能調換。因為步驟二要求cin能正常工作。

          給出下面處理輸入不合法的例子:

          int n;
          while(!(cin >> n)) {
          cin.clear(); //reset input
          while(cin.get() != '\n')
              continue;
            cout << "Please enter a number: ";
          }

          注意當輸入錯誤時,n的值是保持不變的。cin >> n返回false。。

        2. cin.getline(char*, int[, char])

          cin.getline()遇到'\n'會將'\n'從緩沖區中取出。如果緩沖區中的字符串長度超過int。那么字符串會殘留在緩沖區中,但是這時cin的狀態會被設置為錯誤。直接關閉輸入。所以如果不做出cin的錯誤處理,在這個cin作用域以后調用cin時,不會執行這條調用語句。只會直接返回一個任意負值,表示錯誤。

        3. cin.gets()

          cin.getline()遇到'\n',直接返回,'\n'留在緩沖區中。如果緩沖區中的字符串長度超過int,那么多出的字符串會殘留在緩沖區中,且cin的狀態不會改變。下一次使用cin時,正常從緩沖區中讀取字符。

根據以上特點,會遇到一些細小錯誤。

int a;
char word[5];
cout << "Enter a number: "; cin
>> a;
cout << "Enter a word: "; cin.getline(word,
5); cout << "a is :" << a << endl; cout << "word is:" << word << endl;

上述語句會出現下面的錯誤:

            1. Enter a number: 1234[ENTER]
              
              Enter a word: a is :1234
              
              word is:

              原因就在於cin >&gt a;執行時,讀入緩沖區中的1234,留下'\n'(Enter鍵產生的)。cin.getline(word, 5)碰到殘留的'\n'。返回,所以讀進word的是個空字符串。解決辦法就是:

              (cin >> a).get() //(用cin.get()來消除緩沖區中殘留的‘\n’
              
            2. char word1[20];
              char word2[20];
              cin.get(word1, 20);
              cin.get(word2, 20);

              這種清空,word2將讀進空字符。。因為cin.get(word1, 20);將'\n'留在緩沖區中。下一次cin.get(word2, 20);一開始就碰到了'\n'.直接返回。無論后面調用多少次cin.get(char *,...)都無法跳出這個'\n'。還是要使用cin.get(void)消除殘留的'\n'。。

              cin.get(word1, 20).get();
              
            3. 對於輸入字符串長於設置的最大長度時。對於cin.getline(char *,...)要進行錯誤處理。對於cin.get(char *,...)不用進行錯誤處理。由於緩沖區殘留着字符串,兩者都會造成后續cin處理輸入有非常大的不確定性。最好的辦法是在使用cin.getline(char *,...)和cin.get(char *,..)后將緩沖區設置為空。具體處理辦法,這篇文章提供了幾種差異很大的C語言清空緩沖區的方法:C語言清空輸入緩沖區的N種方法。。C++對決大多數方法均兼容。只需稍作改變。。其中我很喜歡那個最經典的C方式。C++中可以這樣做:

              while(cin.get() != '\n') ;

在C++中,對於字符串的管理,可以直接使用C++庫的string類。非常簡單掌握。在性能上也沒有過多的消耗。

如果涉及到C風格的字符數組存儲字符串,那么在輸入時,建議使用cin.get()。一方面,老式編譯器不支持cin.getline()。另一方面,cin.get()對輸入的管理更仔細。賦予程序員更多的管理選擇。。技術要求也不高。。


免責聲明!

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



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