错误处理-何时占用用户输入部分2

error-handling-when-taking-user-input part2

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

我之前提出了一个问题:接受用户输入时的错误处理

我进行了建议的更改:

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();  
    switch(tolower(choice))
    {
        case 'r':
                cout<<"Entered case 'r'";
                break;
        case 'c':
                cout<<"Entered case 'c'";
                break;  
        case 't':
                cout<<"Entered case 't'";                   
                break;
        default:
                cout<<"Invalid choice! Try again"<<endl;   
    }
}
return 0;
}

新的问题是,如果用户错误地输入,让我们说"ter",我会得到以下:(:

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 : ter 
Entered case 't'
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 : Invalid choice! Try again
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 : Invalid choice! Try again

我怎样才能避免这种情况发生??

displayMainMenu() 函数中,不是在char中读取,而是在字符串中读取。 丢弃(带有警告)任何长度大于一个字符的输入。

您可以使用

char str[101]
std::cin.getline(str, 101);

代替

cin >> mainMenuChoice;

为了读取字符串。

试试这个:

string displayMainMenu()
{
    string 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 : ";
    getline(cin, mainMenuChoice);
    return mainMenuChoice;
}
int main()
{
    bool done = false;
    while(!done)
    {
        string choice = displayMainMenu();
        if (choice.size() > 1 || choice.size() < 0)
            cout<<"Invalid choice! Try again"<<endl;
        switch(tolower(choice[0]))
        {
        case 'r':
            cout<<"Entered case 'r'";
            break;
        case 'c':
            cout<<"Entered case 'c'";
            break;  
        case 't':
            cout<<"Entered case 't'";
            break;
        default:
            cout<<"Invalid choice! Try again"<<endl;   
        }
    }
    return 0;
}

使用 getline(istream, string &) 一次读取一整行(不包括 eol)。 检查它的长度是否正确,然后只查看第一个字符。