簡體   English   中英

cin的未知行為

[英]Unknown behavior from cin

首先,我想說的是,我知道使用getline是更好的選擇,但是,我很好奇為什么此代碼無法按預期工作:而且我不知道為什么

#include <iostream>
#include <string>
using namespace std;

int main() {

    while(1) {
        int input;
        cout << "---> ";
        cin >> input;
        if(cin.fail()) {
            char rd = cin.get();
            cout << "failure" << rd << "=" << cin.fail() << " " << endl;
        }
    }


    return 0;
}

目的:如果輸入整數,則繼續,否則cin失敗,我們從stdin中提取一個char並從本質上輸出它。 然后我們繼續循環。

我的看法是,最終cin.get()應該清除錯誤的輸入; 但它永遠不會做到:它陷入無限循環。 什么?

cin.fail()檢測輸入的值是否適合變量中定義的值。 但是,如果cin.fail()為true,則表示

a)輸入的值不適合變量

b)變量不會受到影響

c)溪流仍然破裂

d)輸入的值仍在緩沖區中,並將用於下一個“ cin >>變量”語句。

因此,您必須執行以下操作:

a)通過cin.clear()修復河流;

b)使用cin.ignore(std :: numeric_limits :: max(),'\\ n')清除緩沖區;

   #include <iostream>
   #include <string>
     using namespace std;

     int main() {

     while(1) {
     int input;
     cout << "---> ";
     cin >> input;
     if(cin.fail()) {
        char rd = cin.get();
        cout << "failure" << rd << "=" << cin.fail() << " " << endl;
        cin.clear();
        cin.ignore();
        }
      }
    return 0;
    }

接受輸入整數后,按Enter時,它將獲得換行符作為字符。 與字符輸入相同

#include <iostream>
#include <string>
using namespace std;

int main() {

    while(1) {
        int input;
        cout << "---> ";
        cin >> input;
        getchar();
        if(cin.fail()) {
            char rd = cin.get();
            getchar();
            cout << "failure" << rd << "=" << cin.fail() << " " << endl;

        }
    }
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM