用cin安全地提示是/否

Lev*_*evi 10 c++ user-input

我正在介绍C++类,我想知道一种更好的检查输入是否是所需类型的方法.

这是一个很好的方法吗?我来自PHP/PERL背景,这使我非常担心使用while循环.

char type;
while (true) {
    cout << "Were you admitted? [y/n]" << endl;
    cin >> type;

    if ((type == 'y') || (type == 'n')) {
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一种安全的方式吗?或者我打开自己的伤害世界,我怀疑?什么是更好的方法,以确保我在继续之前得到我想要的输入?

McA*_*den 25

就我个人而言:

do
{
    cout << "Were you admitted? [y/n]" << endl;
    cin >> type;
}
while( !cin.fail() && type!='y' && type!='n' );
Run Code Online (Sandbox Code Playgroud)

  • 这不好.如果`cin`被关闭,它将永远地循环"你被录取了吗?[y/n]"到`cout`.在测试它应该读取的内容之前,始终测试输入操作是否成功非常重要. (9认同)
  • 根据Charles Bailey的评论编辑 - 他是完全正确的.亚历克斯的评论回答了列维的评论.如果将类型初始化为y或n以外的其他类型,则可以使用正常的while循环. (4认同)
  • Do-Whiles主要用于您在检查条件之前要采取某些操作的情况,如果您的条件为真,则会重复此操作.在用户输入的情况下,在检查条件之前要获得一些输入,因此Do-Whiles很方便. (2认同)

CB *_*ley 9

就个人而言,我会将提示作为一个单独的函数,这使得它将提示输出和读取响应作为逻辑表达式放入while循环中.

测试读取是否成功对于代码的正确运行至关重要.

我也更喜欢一次使用std::getline一行,因为它有助于减少读取半读取行的其余部分所导致的错误,这是部分读取早期用户响应的结果.

bool PromptForChar( const char* prompt, char& readch )
{
    std::string tmp;
    std::cout << prompt << std::endl;
    if (std::getline(std::cin, tmp))
    {
        // Only accept single character input
        if (tmp.length() == 1)
        {
            readch = tmp[0];
        }
        else
        {
            // For most input, char zero is an appropriate sentinel
            readch = '\0';
        }
        return true;
    }
    return false;
}

void f()
{
    char type = '\0';

    while( PromptForChar( "Were you admitted? [y/n]", type ) )
    {
        if (type == 'y' || type == 'n')
        {
            // Process response
            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)