【问题标题】:C++ Fix for checking if input is an integer [duplicate]C ++修复检查输入是否为整数[重复]
【发布时间】:2013-09-12 15:00:26
【问题描述】:

例如,如果我输入“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;

【问题讨论】:

    标签: c++ integer


    【解决方案1】:

    两种可能的解决方案:

    1. 首先将输入存储在 std::string 中,而不是直接存储到 int 中。然后,使用 strtol from 转换为整数。如果 endPtr 指向 0,则表示最后什么都没有,所以这没关系。否则,最后会发现一些没有数字的字符
    2. 在您的示例中,std::cin &gt;&gt; dblMarkOne; 将在std::cin 中留下非数字字符,因此如果在之后std::cin 中仍有可用数据,例如使用std::cin.peek()!=EOF,这意味着用户输入了多个一个数字。

    编辑:完整测试代码:

    #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;
            }
        }
    }
    

    【讨论】:

    • 什么是 EOF。它给出了一个错误?
    • EOF 是文件结束标志。
    • 这不起作用 std::cin >> dblMarkOne; while (std::cin.fail() || cin.peek()!=EOF ) { std::cout > dblMarkOne; }
    • peek() 不会从输入中删除字符,它只是返回下一个字符的值而不获取它。所以在这种情况下,错误的字符将被发送到下一个输入。
    • EOF 在 NetBeans 中出现错误
    【解决方案2】:

    一种方法是使用 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 来保存输入并根据您是否要提前中断来迭代其内容,并将输出存储到您的变量.

    【讨论】:

      猜你喜欢
      • 2014-11-29
      • 2017-10-30
      • 1970-01-01
      • 2015-06-20
      • 2013-03-13
      • 1970-01-01
      • 2018-04-18
      • 2012-08-27
      • 2018-05-11
      相关资源
      最近更新 更多