c++ - Cin输入无效输入

标签 c++ input error-handling user-input formatted-input

我有一个程序可以简单地计算Ackermann函数:

#include <iostream>

// Ackermann function calculations
unsigned int ackermann(unsigned int m, unsigned int n){
    if(m == 0)
        return n+1;
    if(n == 0)
        return ackermann(m-1,1);
    return ackermann(m-1,ackermann(m,n-1));
}

// Check for non-integer input
bool inputCheck(){
    if(!std::cin.fail())
        return false;

    std::cout << "Invalid input!" << std::endl;
    return true;
}

// Check for negative or overflow errors
bool numCheck(int i, char name){
    if(i < 0){
        std::cout << "Negative error!" << std::endl;
        return true;
    }

    if(name == 'm' && i > 3){
        std::cout << "Overflow error (m > 3)!" << std::endl;
        return true;
    }

    if(name == 'n' && i > 12){
        std::cout << "Overflow error (n > 12)!" << std::endl;
        return true;
    }

    return false;
}

// Run input and num checks
bool check(int x, char y){
    bool result = inputCheck() || numCheck(x, y);

    std::cin.clear();
    std::cin.ignore();

    return result;
}

int main(){

    int m, n;
    bool valM, valN;

    do{
        std::cout << "m = ";
        std::cin >> m;
        valM = check(m, 'm');
    } while(valM);

    do{
        std::cout << "n = ";
        std::cin >> n;
        valN = check(n, 'n');
    } while(valN);

    std::cout << "\nM = " << m << "\nN = " << n
            << "\n\nCALCULATING..." << std::endl;

    std::cout << "A(" << m << ',' << n << ") = " << ackermann(m,n) << std::endl;

    return 0;
}

大多数代码正在检查无效输入。出于计算原因,m不能大于3,并且n不能大于12。它还会检查输入是否为负。

已知问题:
  • 如果用户输入类似3z的内容。 cin取3,忽略z。显然,3z3不同,我想检测这样的无效输入。
  • 如果用户输入类似1.2的内容。 cin m取1,n取2。该程序将忽略该时间段并将其作为两个输入,我想检测到这样的无效输入。

  • 如何修改或修复代码,使其仅接受正确的输入?

    最佳答案

    这篇文章可能与您的要求有关:

    Checking input value is an integer

    它显示了如何检查从cin到int的新读取值是否是有效的int。

    关于c++ - Cin输入无效输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39649947/

    相关文章:

    c++ - OpenGL 核心和兼容性

    c++ - LINK1104 的 Opencv 构建错误

    javascript - 如何限制 html 数字输入(实时)中允许的数字数量?

    input - <span/> 带有 HTML enter 的字段与没有 HTML enter 的宽度/边距不同

    python - 列表索引超出范围,我不明白为什么?

    c++ - 我如何在 VC++7 及更早版本中模拟 _set_abort_behavior?

    c++ - 在数组迭代器中使用 size_t

    c++ - 使用 ws_ex_transparent active c++ 注册鼠标点击

    Android NDK 输入源

    asp.net - IIS 6 的服务器.TransferRequest