只获取整数作为输入,代码不能按预期工作。

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (29)

我试图只允许输入整合器

应该拒绝:

  • 5H
  • 3.4
  • 3.gh
  • 3.0
  • HTR

应该接受:

  • -5
  • 0
  • 78

现行代码

int getIntInput() {
    int userInput;

    while (true) {
        std::cout << "> ";
        std::cin >> userInput;
        std::cout << std::flush;

        if (std::cin.fail()) {
            std::string cinBuffer;
            std::cin.clear();
            std::getline(std::cin, cinBuffer);
            continue;
        }
        break;
    }
    return userInput;
}

更新的代码

问题:

  • 接受除“htr”之外的所有拒绝(无数字) int getIntInput() { std::string rawInput; int parsedinput; while (true) { std::cout << "> "; std::getline(std::cin, rawInput); std::cout << std::flush; try { parsedinput = std::stoi(rawInput); } catch (std::invalid_argument & e) { continue; } catch (std::out_of_range & e) { continue; } break; } return parsedinput; }

完成的代码

  • 仅接受带有可选参数的整数,该参数允许接受或拒绝负数。 int getIntInput(bool allowNegatives = true) { bool validIntInput; std::string rawInput; int parsedinput; while (true) { validIntInput = true; // Grabs the entire input line std::cout << "> "; std::getline(std::cin, rawInput); std::cout << std::flush; for (int i = 0; i < rawInput.length(); i++) { // Checks to see if all digits are a number as well as to see if the number is a negative number if (!isdigit(rawInput[i]) && !(allowNegatives && i == 0 && rawInput[i] == '-')) { validIntInput = false; break; } } if (!validIntInput) { continue; } else { try { // Try parse the string to an int parsedinput = std::stoi(rawInput); // Catch all possible exceptions, another input will be required } catch (...) { continue; } // If the code reaches here then the string has been parsed to an int break; } } return parsedinput;}
提问于
用户回答回答于
template<class T>
T findInStreamLineWith(std::istream &input) {
    std::string line;
    while (std::getline(input, line)) {
        std::istringstream stream(line);
        T x;
        if (stream >> x >> std::ws && stream.eof()) {
            return x;
        }
        // reenter value
        // cout << "Enter value again: ";
    }
    throw std::invalid_argument("can't find value in stream");
}

…
auto x = findInStreamLineWith<int>(std::cin);
用户回答回答于

如果你不介意开销,我会从cin中获取输入cin.getline()并将其保存到字符串中。然后遍历字符串并调用isdigit每个char。可以使用该str.erase功能丢弃非数字的字符。

你需要#include cctype isdigit()

注意:根据字符串的长度,这将至少具有O(N)运行时。

所属标签

可能回答问题的人

  • 西风

    renzha.net · 站长 (已认证)

    9 粉丝1 提问5 回答
  • uncle_light

    5 粉丝518 提问3 回答
  • 学生

    2 粉丝477 提问3 回答
  • 军哥

    重庆雷驰信息技术有限公司 · 经理 (已认证)

    5 粉丝1 提问3 回答

扫码关注云+社区

领取腾讯云代金券