接受用户输入时的错误处理

error handling when taking user input

本文关键字:错误 处理 输入 用户      更新时间:2023-10-16

我是 c++ 的初学者,我有一个小问题:

我的代码向用户显示一个简单的菜单,提供三个选项:

cout << "nQuadratic equation: a*X^2 + b*X + c = 0 main menu: "; 
cout << "n <r>  Give new coefficients"; 
cout << "n <c>  Calculate equations solutions"; 
cout << "n <t>  Terminate the program";

我现在想要的是,当用户输入:

  • aer ->输入的输入无效,请重试
  • 输入 1 或任何其他数字>无效输入,请重试
  • rt ->输入无效,请重试(这里第一个字符是正确的,但他输入了 2 个字符)
  • cf ->输入的输入无效,请重试

仅当用户正确输入 3 个简单字符(R,C,T 非敏感大小写)之一时。否则,应打印无效输入的按摩,然后再次出现主菜单

我试过这个,但它不起作用:

char displayMainMenu()
{
char mainMenuChoice;
cout << "nQuadratic equation: a*X^2 + b*X + c = 0 main menu: "; 
cout << "n <r>  Give new coefficients"; 
cout << "n <c>  Calculate equations solutions"; 
cout << "n <t>  Terminate the program";
cout<<"Enter choice : ";
cin>>mainMenuChoice;
return mainMenuChoice;
}
int main()
{
bool done = false;
while(!done)
{
    char choice = displayMainMenu();  
    if( isalpha(choice) )
    {
        switch(tolower(choice))
        {
        case 'r':
            DoSTH1();
            break;
        case 'c':
            DoSTH2();
            break;  
        case 't':
            DoSTH3();                   
            break;
        default:
            cout<<"Invalid choice!n"<<endl;
        }   
    }
}
return 0;
}

希望你能帮助我

添加:当我错误地输入例如:cbbbbbb它把它当作"C"

要通过"cbbb"被接受为"c",您必须使用 getline() 在一行中读取。 然后,您可以检查是否只输入了一个字符,然后检查输入了哪个字符。

如果使用 cin 读取字符,则它只会读取输入流中可用的第一个字符。

更改此行:

cout<<"Enter choice : " << std::endl;
                    // ^^^^^^^^^^^^^^^

然后,此打印 '' 强制缓冲区刷新到输出,以便可以读取。

如果只想刷新缓冲区:

cout<<"Enter choice : " << std::flush;

删除 if 语句。不需要使用交换机进行错误检查。

// if( isalpha(choice) )

首先,省略if( isalpha(choice) )。它不是必需的,因为除了rct之外的任何输入都将落入default

实际上,这可能是您问题的原因。如果输入的字符不是字母数字,则该函数将结束而不显示错误消息。

总的来说,我的建议是:不要想得太复杂。开关的美妙之处在于,您可以对完全匹配项进行操作,而所有其他匹配项都将失败default

"我试过这个,但它不起作用"是什么意思? 你得到什么输出? 你的意思是它不编译吗? (它不会处于您显示的状态)。 你的意思是这个项目比我们看到的要多,但它产生了意想不到的结果吗? 我们没有足够的时间来调试它。 对于它的价值,我没有看到任何错误(除了它显然不完整):

#include <iostream>
using namespace std;
char displayMainMenu() {
    char mainMenuChoice;
    cout << "nQuadratic equation: a*X^2 + b*X + c = 0 main menu: ";
    cout << "n <r>  Give new coefficients";
    cout << "n <c>  Calculate equations solutions";
    cout << "n <t>  Terminate the program";
    cout<<"nEnter choice : ";
    cin>>mainMenuChoice;
    return mainMenuChoice;
}
int main() {
    bool done = false;
    while(!done) {
        char choice = displayMainMenu();
        if( isalpha(choice) ) {
            switch(tolower(choice))
            {
            case 'r':
                    cout << "got 'r'n";
                    break;
            case 'c':
                    cout << "got 'c'n";
                    break;
            case 't':
                    cout << "got 't'n";
                    done = true;
                    break;
            default:
                    cout<<"Invalid choice!n"<<endl;
            }
        }
    }
    return 0;
}

和输出:

~ $ g++ input.cc -o input
~ $ ./input
Quadratic equation: a*X^2 + b*X + c = 0 main menu:
 <r>  Give new coefficients
 <c>  Calculate equations solutions
 <t>  Terminate the program
Enter choice : a
Invalid choice!

Quadratic equation: a*X^2 + b*X + c = 0 main menu:
 <r>  Give new coefficients
 <c>  Calculate equations solutions
 <t>  Terminate the program
Enter choice : c
got 'c'
Quadratic equation: a*X^2 + b*X + c = 0 main menu:
 <r>  Give new coefficients
 <c>  Calculate equations solutions
 <t>  Terminate the program
Enter choice : t
got 't'
~ $

更新我看到它没有为非数字提供"无效选择"消息,但可以通过删除"isalpha"检查来修复。