如何检查输入的有效性?-C++

How to check for input validity? - C++

提问人:brickleygee 提问时间:2/12/2023 最后编辑:James Risnerbrickleygee 更新时间:2/12/2023 访问量:120

问:

srand(time(0));

int rolls, x;
string input;
die *d;

die header1;

cout << "Please enter the number of dies to use (4, 5, or 6) or press enter to default to 6 dies: ";
getline(cin, input);

if (input.empty())
{
    // 6 dies by default
    x = 6;
}
else if (input != "4" && input != "5" && input != "6" && !(cin.get() == '\n'))
{
    
    while (input != "4" && input != "5" && input != "6") {

        cout << "INVALID Input: ";
        getline(cin, input);

    }
}
else
    x = stoi(input);

我不明白为什么循环不会退出。用户只需输入 4、5、6 和 ENTER 键即可获得默认值 6。我检查了他们是否只是在第一次尝试时按了 ENTER 键,但如果他们按了其他东西,比如 2 或其他任何东西,它会说输入无效。不过,在while循环中,只要他们输入4,5,6和ENTER键,它就应该退出吧?它不仅会不断循环,而且当我将 cin.get() 条件添加到 while 循环中时,它似乎甚至在再次重复循环之前期待用户输入。我是否错误地使用 cin.get() 来检查用户输入空虚?

C++ 验证 if-statement 输入 while 循环

评论

1赞 Nathan Pierson 2/12/2023
是的。为什么要检查用户输入空虚?您之前在代码中检查用户输入空的方式有什么问题,但工作正常?cin.get()
2赞 Chris 2/12/2023
请举一个完整的例子。例如,我们无法看到如何声明。input
1赞 Chris 2/12/2023
你为什么不直接写而不是?cin.get() != '\n'!(cin.get() == '\n')
0赞 brickleygee 2/12/2023
对不起,第一次来这里,我编辑并更新了代码
0赞 brickleygee 2/12/2023
@Chris我的教授就是这样说的。即使我这样做,当我添加 cin.get() 作为条件时,当我到达 else if 语句时,它仍然会提示用户输入,如果这有意义的话

答:

2赞 PaulMcKenzie 2/12/2023 #1

可以重写输入以使用外部循环,该循环继续循环,直到输入可接受为止。那么就没有必要使用/误用了:whilecin::get

#include <iostream>
#include <string>

int main()
{
    std::string input;

    // loop until the input is good 
    while (true)
    {
        std::cout << "Please enter the number of dies to use (4, 5, or 6) or press enter to default to 6 dies: ";
        std::getline(std::cin, input);

        // something was entered
        if (!input.empty())
        {
            // check for 4, 5, or 6 being entered
            if (input == "4" || input == "5" || input == "6")
                break; // get out of input loop
            else
                // input entered is no good 
                std::cout << "\nINVALID Input: " << input << ".  Please try again:\n\n";
        }
        else // nothing was entered
        {
            input = "6";
            break; // get out of input loop
        }
    }
    std::cout << "\nSuccess: Your input was: " << input;
}

现场示例

请注意,类似的东西不会被视为有效,因为有一个尾随空格。如果您需要修剪任何多余的空间,那是另一个问题。4