方式的std ::函数getline(给std :: cin,字符串)可以从键盘输入失败

问题描述 投票:2回答:1

我写此功能要求特定的输入类型。 is_type只是将验证收到的字符串可以使用字符串流至所需的类型被铸造。

template<typename T>
T get_type(std::string prompt)
{
    T output;
    std::cout << prompt;
    std::string Input;
    while (std::getline(std::cin, Input) && !is_type<T>(Input))
    {
            std::cout << "Invalid input type. Please try again:\n"
              << prompt;
    }

    std::stringstream(Input) >> output;
       return output;
}

功能似乎期望除了当我例如键入Ctrl + Z工作。什么是适当的方式来处理这件事?

我说:

template<typename T>
    T get_type(std::string prompt)
    {
        T output;
        std::cout << prompt;
        std::string Input;
        while (std::getline(std::cin, Input) && !is_type<T>(Input))
        {
                std::cout << "Invalid input type. Please try again:\n"
              << prompt;
        }
        if (!std::cin)
        {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        output = get_type<std::string>(prompt) ;
        return output;
        }
        std::stringstream(Input) >> output;
           return output;
    }

这再次从用户下kewyboard输入失败的输入例如CTRL + Z这是否解决我的性病的问题后::函数getline(给std :: cin,的std :: string)要求?

另外,为什么我打输入2次的

output = get_type<std::string>(prompt) ; 

行到如果内运行。

c++ cin getline
1个回答
0
投票

如果您以前使用std::getline不清除failbit stdin可能会失败,如果输入超过std::string::max_size(见戴维斯鲱鱼的评论)。否则,我知道没有办法让std::getline失败除非EOF(^Z/^D)。

但是,这里有一些小的改进你的代码:

template<typename T>
T get_type(std::string prompt)
{
    T output;
    std::string input;
    while(true)
    {
        std::cout << prompt;
        std::getline(std::cin, input);
        std::istringstream iss(input);
        if(!std::cin)
        {
            std::cin.clear();
        //  std::clearerr(stdin);
        }
        else if(iss >> output && iss.eof())
            return output;

        std::cout << "Invalid input type. Please try again:\n";
    }
}

正如在评论中提到,有必要在某些系统上clearerr使用stdin。如果您的系统要求,只是取消注释std::clearerr(stdin);

因为你的2倍<Enter>的问题:忽略声明是不必要的。你刚才忽略下一个输入(这就是为什么你打<Enter>两次)。

© www.soinside.com 2019 - 2024. All rights reserved.