实现此switch语句的更智能的方式

Smarter way to implement this switch statement

本文关键字:方式 智能 语句 switch 实现      更新时间:2023-10-16

所以我试图允许用户进行选择,但我遇到了问题。下列线路

cout << "nWhat would you like to do? " << endl
    << "(1) Display the entire List" << endl
    << "(2) to exit" << endl;
getline(cin,answer);
answerint=stoi(answer);
switch (answerint) {
    case 1:
        showLIST(myLIst);
        break;
    case 2:
        return;
    default:
        cout << "nPlease choose from the list";
   }

因此,如果用户选择了一个整数,这很好,但如果接收到一个字符,它就会弹出。我怎样才能让它不那么易碎?

你似乎想要这样的东西:

if (std::cin >> answerint) {
    switch (answerint) {
        // ...
    }
}

如果输入了不同于int的内容,则直接从流转换整数会使流处于故障状态。您可能需要添加一个操纵器,以确保行的末尾没有非空格字符。

std::string answer;
int answerint;
while (std::getline(std::cin, answer))
{
    std::istringstream iss(answer);
    char c; // seek non-whitespace after the number?
    if (!(iss >> answerint) || (iss >> c))
        answerint = 0;
    switch (answerint)
    {
      ...as you had...
    }
}

上面的代码使用getline来确保将一行完整的文本解析为answer,然后从这一行创建一个不同的std::istringstream。这样,我们就可以使用>>,因为我们知道它不会跳过正在消耗或等待进一步输入的换行符。

if (!(iss >> answerint) || (iss >> c))检查是否没有要解析为answerint的数字,或者在解析了数字后,行上会出现一个额外的非空白字符。例如,键入的行可能是2r——我们会认为这是一个错误,并重新尝试选择,将0分配给answerint,以确保我们到达switch中的default标签,从而打印cout << "nPlease choose from the list";,这似乎与99或其他什么一样适合2r。。。。

通过这种方式使用getline和单独的istringstream,可以可靠地尝试从已知状态解析下一行输入。