【问题标题】:How to check if input is numeric in C++如何在 C++ 中检查输入是否为数字
【发布时间】:2011-08-05 00:53:52
【问题描述】:

我想创建一个程序,它接收来自用户的整数输入,然后在用户根本不输入任何内容时终止(即,只需按 Enter 键)。但是,我在验证输入时遇到了问题(确保用户输入的是整数,而不是字符串。atoi() 不起作用,因为整数输入可以超过一位。

验证此输入的最佳方法是什么?我尝试了类似以下的方法,但我不确定如何完成它:

char input

while( cin>>input != '\n')
{
     //some way to check if input is a valid number
     while(!inputIsNumeric)
     {
         cin>>input;
     }
}

【问题讨论】:

  • input 是一个指针。你为什么要使用 cin 来输入它?我不确定是否可以这样给出地址,但地址位置以 hexa-decimal 系统表示,并且有可能是字母数字。
  • 呸,我正在从内存中重新创建这段代码(不是复制和粘贴)。让我尝试解决这个问题。
  • 您的 while 条件无法编译。也许你应该选择for(cin>>input; input != '\n'; cin >>input)

标签: c++


【解决方案1】:

cin 获得无法使用的输入时,它会设置failbit

int n;
cin >> n;
if(!cin) // or if(cin.fail())
{
    // user didn't input a number
    cin.clear(); // reset failbit
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //skip bad input
    // next, request user reinput
}

cinfailbit被设置时,使用cin.clear()重置流的状态,然后cin.ignore()删除剩余的输入,然后请求用户重新输入。只要设置了失败状态并且流包含错误输入,流就会出现异常。

【讨论】:

  • 这个问题(与我对 Q 的阅读相反)是按一下 后它不会放弃;相反 - cin &gt;&gt; n 将继续运行,直到成功、错误或文件结束。
  • @Tony:这是真的,但它也不会推进读取指针,直到它成功读取。我已经编辑了我的帖子。
  • 别忘了.reset() 直播。
  • 奇怪的是,这不适用于 G++-47 编译器(Mint 16)。不知道为什么。
  • @AlvinCaseria:你能澄清一下“不起作用”是什么意思吗?
【解决方案2】:

查看std::isdigit() 函数。

【讨论】:

    【解决方案3】:

    使用问题

    cin>>number_variable;
    

    是当你输入 123abc 值时,它会通过,你的变量将包含 123。

    你可以使用正则表达式,像这样

    double inputNumber()
    {
        string str;
        regex regex_pattern("-?[0-9]+.?[0-9]+");
        do
        {
            cout << "Input a positive number: ";
            cin >> str;
        }while(!regex_match(str,regex_pattern));
    
        return stod(str);
    }
    

    或者您可以更改 regex_pattern 以验证您想要的任何内容。

    【讨论】:

    • 这是 c++ 11 中的好主意
    【解决方案4】:

    我发现自己这些天一直在使用boost::lexical_cast 来处理这类事情。 示例:

    std::string input;
    std::getline(std::cin,input);
    int input_value;
    try {
      input_value=boost::lexical_cast<int>(input));
    } catch(boost::bad_lexical_cast &) {
      // Deal with bad input here
    }
    

    该模式也适用于您自己的类,只要它们满足一些简单的要求(必要方向的流式传输,以及默认和复制构造函数)。

    【讨论】:

      【解决方案5】:

      为什么不直接使用scanf("%i") 并检查它的返回值?

      【讨论】:

        【解决方案6】:

        我猜 ctype.h 是你需要查看的头文件。它有许多处理数字和字符的功能。 isdigit 或 iswdigit 在这种情况下会为您提供帮助。

        这是一个参考: http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/devwin32/isdigit_xml.html

        【讨论】:

          【解决方案7】:

          如果你已经有了字符串,你可以使用这个函数:

          bool isNumber( const string& s )
          {
            bool hitDecimal=0;
            for( char c : s )
            {
              if( c=='.' && !hitDecimal ) // 2 '.' in string mean invalid
                hitDecimal=1; // first hit here, we forgive and skip
              else if( !isdigit( c ) ) 
                return 0 ; // not ., not 
            }
            return 1 ;
          }
          

          【讨论】:

            【解决方案8】:

            可以做的就是读取文本输入,然后尝试将其转换为数字:

            try 
            {
                std::string str;
                std::getline(std::cin, str)
                age = std::stoi(str)
            }
            catch(...)
            {
                // ...
            }
            

            然后你可以通过捕获异常来处理错误。

            https://en.cppreference.com/w/cpp/string/basic_string/stol

            【讨论】:

              猜你喜欢
              • 2013-06-21
              • 1970-01-01
              • 2012-12-30
              • 2021-09-14
              • 1970-01-01
              • 2011-07-22
              • 1970-01-01
              相关资源
              最近更新 更多