如何为开关盒提供强大的用户输入?

时间:2014-02-23 17:00:18

标签: c++ switch-statement cin fgets

我正在尝试为开关案例制作完全防错的输入。如果用户输入错误的数字,字母或长串的数字或字母(这是我以前遇到错误的地方),则不必失败。

如果用户输入例如,以防止错误。 "asdghdk3"我尝试过使用数组,因此它会检查每个字母,直到找到一个数字。

然后我尝试将其转换为开关案例的整数。 可悲的是我的代码不起作用。有没有人有任何建议或改进? 谢谢。

#include <iostream>
#include <vector>
#include <cmath>
#include <cstdlib>

using namespace std;

int main()
{
    cout<<"Please choose the method you would like to use to evaluate the potential. Please enter 1,2 or 3:"<<endl;
    cout<<"1. my method. \n2. jacobi method. \n3. Exit programme. \nYou chose: ";

    char choice[20];
    bool k = true;

    int choice2;
    while (k == true){
        fgets(choice, sizeof choice, stdin);
        for(int j=0; j<sizeof(choice); j++){
            if (isdigit(choice[j])==true){  //I want it to check every character until it finds a number.
                choice2 = atoi(choice[j]); //changed name as now integer to be used in switch case.
                k = false;
                break; //so that it breaks out of the for loops because it has found a number
            }
            else{
                continue;
            }
        }
        cout<<"Incorrect input please try again";
    }

    cout<<"\nchoice2= "<<choice2<<endl;

    switch ( choice2 ) {
        case 1 :
            // Code
            break;
        case 2:
            // Code
            break;
        case 3:
            //code to exit programme
            break;
        default:
            // Code
            break;
    }

    return 0;
}

编辑: 我希望它只接受1,2或3,其他一切返回不正确的输入请再试一次。

使用namespace std;

int main()
{
    string line;
    getline(cin, line);
    istringstream choice(line);
    int number;
    choice >> number;

    if (choice)
    {
        if (choice == 1)
        {
            cout << "you chose option 1\n";
            //code.....
        }
        else if (choice == 2)
        {
            cout<< "you chose option 2\n";
            //code.....
        }
        else if (choice == 3)
        {
            cout<< "you chose option 3\n";
            //code......
        }
    }
    else
    {
        cout << "input does not start with a number or is too big for an int\n";
    }
return 0;
}

2 个答案:

答案 0 :(得分:0)

您应该使用std::cin并检查其状态:

int choice = -1;
if (cin >> choice)
{
    // you know user entered a number, check that it's in the correct range

    if (cin.peek() != '\n')
        // there's more input, so probably an error
}
else
{
    // bad input
}

答案 1 :(得分:0)

std::cin读取整行std::string std::getline,然后将该行转换为带std::istringstream的整数。最后,转换后,检查字符串流中是否还有字符。这是一个完整的例子:

#include <iostream>
#include <sstream>
#include <string>

int main()
{
    std::string line;
    std::getline(std::cin, line);
    std::istringstream is(line);
    int number;
    is >> number;

    if (is)
    {
        if (!is.eof())
        {
            std::cerr << "input does not end with a number\n";
        }
        else
        {
            std::cout << "input ok\n";
        }
    }
    else
    {
        std::cerr << "inut does not start with a number or is too big for an int\n";
    }
}