繁体   English   中英

如何为开关盒提供可靠的用户输入?

[英]How to make a robust user input for a switch case?

我正在尝试为开关盒提供完全防错的输入。 如果用户输入了错误的数字,字母或一长串数字或字母(这是我之前遇到过错误的地方),它就不会失败。

为了防止错误,如果用户输入例如 我尝试使用"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,对于其他所有返回错误输入的内容,请重试。

使用名称空间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;
}

您应该使用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
}

std::cin的整行读取为带有std::getlinestd::string ,然后使用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";
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM