进行用户输入时的错误处理

时间:2008-10-25 12:50:59

标签: c++

我是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 - &gt;输入的输入无效,请重试
  • 输入了
  • 1或任何其他数字&gt;无效输入,请重试
  • rt - &gt;输入的输入无效,请重试 (这里第一个字符是正确的,但他输入了2个字符)
  • cf - &gt;输入的输入无效,请重试

只有当用户正确地输入3个简单字符(r,c,t NONSENZTIVE CASE)中的一个时才能做某事。否则,应打印无效输入按钮,然后再显示主菜单

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

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'

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

更改此行:

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

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

如果您只想刷新缓冲区:

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

删除if语句。您不需要使用开关进行错误检查。

// if( isalpha(choice) )

答案 2 :(得分:1)

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

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

总的来说,我的建议是:不要认为太复杂。开关的美妙之处在于您可以根据完全匹配进行操作,所有其他将落到default

答案 3 :(得分:1)

“我试过这个但它不起作用”是什么意思?你得到什么输出?你是说它不编译? (它不会在您展示的状态)。你的意思是那个程序有更多的东西,然后我们看到的却会产生意想不到的结果吗?我们没有足够的调试这个。对于它的价值,我没有看到任何错误(除了它显然是不完整的):

#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”检查来解决此问题。