检查char变量的输入

时间:2016-11-19 18:08:34

标签: c++ validation char

我尝试在我的程序中验证退出/返回问题的输入,因此用户被迫输入'r''q'

我设法让它几乎正常工作。问题是如果用户在开头输入'r''q'后跟随机字母,则程序接受该输入。关于如何让程序只允许一个'r''q'

的任何想法
void exit()
{
    char choice;
    bool badInput;

    do
    {
        cout << "Press 'r' to return to the menu\nPress 'q' to quit the program\n\n" << endl;
        cin >> choice;

        badInput = cin.fail();
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    } while (badInput == true && choice == 'r' && choice == 'q' && (cin.peek() == EOF));


        if (choice == 'q')
        {
            system("CLS");
            cout << "Bye!\n";
            system("PAUSE");
        }
        else if (choice == 'r')
        {
            system("CLS");
            main();
        }
        else
        {
            exit();
        }
}

2 个答案:

答案 0 :(得分:0)

你有一个非常奇怪的方法来解决这个问题,这个问题很多。特别是,创建一个名为exit()的函数是有问题的,因为它是一个核心函数,并且递归调用它来尝试获取输入同样不是一个好计划。你已经有了一个循环,你只需要更有效地使用它。

同样,main()会自动调用,您永远不应该有理由手动调用它。

这是第一次重写:

void getInput()
{
    char choice;

    while (true)
    {
        cout << "Press 'r' to return to the menu\nPress 'q' to quit the program\n\n" << endl;

        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');

        cin >> choice;

        switch (choice)
        {
            case 'q':
                system("CLS");
                cout << "Bye!\n";
                system("PAUSE");
                exit(0);
                break;
            case 'r':
                system("CLS");
                doMain();
                break;
        }
    }
}

这显然需要更多工作,但至少应该理论上功能。在您的原始代码中,您要求输入值同时是两个不同的东西,这是不可能的,代码永远不会起作用。

我还鼓励你停止做system("CLS")system("PAUSE")这样的事情,而是用C ++本地做一些事情。这不是可移植的代码,它非常笨重,因为它依赖于20世纪80年代DOS的命令。

答案 1 :(得分:0)

处理输入

大多数实现都使用缓冲的cin,因此只有在用户按回车键后才会返回输入。如果您不接受此操作,则必须使用与操作系统相关的功能。

如果你没问题,那么如果你读了一个字符,只有第一个字符将被移交:剩下的字符直到输入将等待后续读取。因此,我建议您不要读取单个字符串,而是将整行读入字符串:

void want_exit() 
{
    const string message="Press 'r' to return to the menu\nPress 'q' to quit the program\n";
    string line; 

    cout << message << endl;
    while (getline(cin, line) && line.length()!=1 
          && tolower(line[0])!='y' && tolower(line[0])!='n') 
    {
        cout << "Invalid input" <<endl << message <<endl; 
        line.resize(0); 
    }

现在,line包含一个有效的char,或者它是空的(在eof过早的情况下,意味着存在输入重定向,并且无论如何都不再有输入)。

处理输入

你不能递归地调用main():你应该从函数返回,并组织调用函数以便继续进程

    if (line.empty() ||  tolower(line[0])!='y' ) {
         system("CLS");   // This is non portable 
         cout << "Bye!\nPress enter...";
         cin.getch();    //  as good as system("PAUSE");
         std::exit(0);   // be aware of the naming issue ! 
    } 
    return; 
}

调用函数(main()?)然后在循环中使用它:

while (...) {
    ...
    if (...) 
        want_exit();    
}