簡體   English   中英

C ++使用cin.fail()和cin.clear()-我有一個無限循環,不知道為什么

[英]C++ Using cin.fail(), cin.clear() — I have an infinite loop and don't know why

您不能在同一行中使用cin然后使用cin.fail()嗎? 有沒有更清潔或更標准的方法可以在輸入時執行這種類型的錯誤檢查?-也許不使用do-while。

do {
     cin.clear();
     cout << "\nPlease enter the size of the array (1-10): ";
} while (cin >> array_size && array_size <= 1 || array_size >= 10 || cin.fail());

這個作品:

do {
    cout << "Please input #: ";
    if (cin.fail()){
        cin.clear();
        cin.ignore(80, '\n');
    }
    cin >> kids_total;
} while (cin.fail() || kids_total <= 0);
cin >> array_size && array_size <= 1 || array_size >= 10 || cin.fail()

假設您接下來在cin有一封信, cin >> array_size評估結果為false因此&&短路評估跳過array_size <= 1進行測試:

  • array_size >= 10 :可能是未初始化的內存,讀取==>未定義的行為,否則可能為false
  • cin.fail() -絕對true

...除非存在未定義的行為-甚至即使這樣-循環仍將繼續而不會刪除cin的字母,只會立即再次失敗。

檢查cin.ignore以找到一種方法來刪除解析失敗的輸入,或者使用std::getline(std::cin, my_string)std::istringstream iss(my_string); if (iss >> array_size std::istringstream iss(my_string); if (iss >> array_size等,以確保在錯誤的輸入中將整個行丟棄。...


為了比較,這很健壯,恕我直言,如果冗長。 如果多次執行此操作,只需創建一個函數即可。...

while (true)
{
    std::cout << "Please input #: ";
    if (std::cin >> kids_total)
    {
        if (kids_total > 0)
            break;
        std::cout << "Value must be > 0, please try again.\n";
    }
    else if (std::cin.eof())
    {
        // rare for keyboard input - e.g. ^D on UNIX/Linux, ^Z Windows
        // can happen with pipes/redirects - e.g. echo 10 20 | ./my_app
        std::cerr << "expected value for kids_total but encountered end of input\n";
        exit(EXIT_FAILURE);
    }
    else
    {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
}

暫無
暫無

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

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