簡體   English   中英

std :: cin有時會掛起,有時在無效輸入后會永遠重復

[英]std::cin sometimes hangs, sometimes repeats forever after invalid input

在這種情況下,當標記為hang point的線接收到無效輸入時,例如。 abc ,它重復內部的do-while循環並再次到達該行時掛起。

// figure 1
std::string s;
do {
    do {
        std::cout<<"s = ";
        std::getline(std::cin, s);
    } while (s == "");
    double d;
    std::cout<<"d = ";
    do {
        std::cin.clear();
        std::cin>>d; // hang point
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    } while (std::cin.fail());
} while (s != "exit");

在這種情況下,程序將跳過該行並永遠重復do-while循環。

// figure 2
double d;
do {
    std::cout<<"d = ";
    std::cin.clear();
    std::cin>>d; // skip point
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
} while (std::cin.fail());

為什么?

最初,我要問為什么figure 1掛起,並且在嘗試簡化示例的過程中,我想到了figure 2 ,發現它沒有掛起,但是一直重復。 我不明白為什么figure 1figure 2做什么。

編輯:在我為自己寫的提示符下輸入字母數據,導致cin失敗。 例如。

s = something
d = 3
s = something
d = a

圖2:您必須在cin.ignore()之前調用cin.clear()。 否則,cin.ignore不會執行任何操作,因為cin仍處於錯誤狀態。

double d;
do {
    if (std::cin.fail()) {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
    std::cout<<"d = ";
    std::cin>>d;
} while (std::cin.fail());

我的印象是您正在重置標志,但是cin緩沖區仍然已滿。 因此,當它重新進入循環時,將自動重新分配字母值(例如,您在終端輸入的“ abc”)“ d”。 因此,失敗標志將被重置,並且循環再次重復。

這是固定版本(進行了一些樣式更改,對此感到抱歉):

#include <string>
#include <iostream>

int main(){
    std::string s="";
    std::string dummy="";
    while ( s!="exit"){
        s="";
        while (s==""){
            std::cout<<"s = ";
            std::getline(std::cin, s);
        }
        double d;
        std::cout<<"d = ";
        do {
            if (std::cin.fail()){
                std::cin.clear();
                std::getline(std::cin, dummy);
                std::cout << "d = ";
            }
            std::cin>>d;
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        } while (std::cin.fail());
    }
}

暫無
暫無

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

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