C ++修复以检查输入是否为整数

时间:2013-09-12 15:00:26

标签: c++ integer

例如,如果我输入“2a”,它不会显示错误,也不会要求用户重新输入值。我该如何解决这个问题?

while (std::cin.fail())
{ 
    std::cout << "ERROR, enter a number" << std::endl;
    std::cin.clear();
    std::cin.ignore(256,'\n');
    std::cin >> dblMarkOne;
}
std::cout << "" << std::endl;

2 个答案:

答案 0 :(得分:3)

两种可能的解决方案:

  1. 首先将输入存储在std :: string中,而不是直接存储到int中。然后,使用strtol from转换为整数。如果endPtr指向0,则表示结尾没有任何内容,所以这没关系。否则,最后会找到一些没有数字的字符
  2. 在您的示例中,std::cin >> dblMarkOne;会在std::cin中留下非数字字符,因此如果std::cin之后仍有数据可用,例如使用std::cin.peek()!=EOF,这意味着用户输入了多个号码。
  3. 编辑:完整测试的代码:

    #include <iostream>
    #include <cstdio>
    
    int main(int argc, char ** argv)
    {
        bool ok = false;
        int dblMarkOne;
        std::cout << "Enter a number" << std::endl;
        while (!ok)
        { 
            std::cin >> dblMarkOne;
    
            if(!std::cin.fail() && (std::cin.peek()==EOF || std::cin.peek()=='\n'))
            {
                ok = true;
            }
            else
            {
                std::cin.clear();
                std::cin.ignore(256,'\n');
                std::cout << "Error, Enter a number" << std::endl;
            }
        }
    }
    

答案 1 :(得分:0)

一种方法是使用isDigit()函数。

对于ascii中的数字字符返回1,否则返回0。

如何使用它取决于您是否期望一位数,而只是检查或想要更长的数字。

如果要提取在出现非数字字符之前出现的数字字符,请将其存储到char []或std :: string,然后遍历每个字符,丢弃您不想要的字符或退出在第一个角色。

如果你只是在一个数字之后,修改你的循环:

std::cin >> dblMarkOne;

while (!isDigit(dblMarkOne)) {
    std::cout << "ERROR, enter a number" << std::endl;
    std::cin.clear();
    std::cin.ignore(256,'\n');
    std::cin >> dblMarkOne;
}

如果你想要一个长于一位数的数字,只需创建一个std :: string来保存输入并根据你是否要提前中断来迭代其内容,并将输出存储到你的变量中