如何检查 C 字符串是否为 int?

新手上路,请多包涵

当我使用 getline 时,我会输入一堆字符串或数字,但如果它不是数字,我只希望 while 循环输出“单词”。那么有没有办法检查“单词”是否是一个数字?我知道我可以将 atoi() 用于 C 字符串,但是对于字符串类的字符串呢?

 int main () {
  stringstream ss (stringstream::in | stringstream::out);
  string word;
  string str;
  getline(cin,str);
  ss<<str;
  while(ss>>word)
    {
      //if(    )
        cout<<word<<endl;
    }
}

原文由 user342231 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 818
2 个回答

另一个版本…

使用 strtol ,将其包装在一个简单的函数中以隐藏其复杂性:

 inline bool isInteger(const std::string & s)
{
   if(s.empty() || ((!isdigit(s[0])) && (s[0] != '-') && (s[0] != '+'))) return false;

   char * p;
   strtol(s.c_str(), &p, 10);

   return (*p == 0);
}

为什么 strtol

就我喜欢 C++ 而言,有时 C API 是我所关心的最佳答案:

  • 对于被授权失败的测试,使用异常是矫枉过正的
  • 当 C 标准库有一个鲜为人知的专用函数来完成这项工作时,词法转换创建的临时流对象是过度杀伤和效率过低的。

它是如何工作的 ?

strtol 乍一看似乎很原始,因此解释将使代码更易于阅读:

strtol 将解析字符串,在第一个不能被视为整数一部分的字符处停止。如果您提供 p (就像我在上面所做的那样),它会在第一个非整数字符处设置 p

我的推理是,如果 p 没有设置到字符串的末尾(0字符),那么字符串中有一个非整数字符 s ,意思是 s 不是正确的整数。

第一个测试是为了消除极端情况(前导空格、空字符串等)。

当然,此功能应该根据您的需要进行定制(前导空格是错误的吗?等等)。

资料来源:

参见 strtol 的描述: http ://en.cppreference.com/w/cpp/string/byte/strtol。

另请参见 strtol 的姊妹函数的描述( strtodstrtoul 等)。

原文由 paercebal 发布,翻译遵循 CC BY-SA 4.0 许可协议

从 C++11 开始,您可以使用 std::all_of::isdigit

 #include <algorithm>
#include <cctype>
#include <iostream>
#include <string_view>

int main([[maybe_unused]] int argc, [[maybe_unused]] char *argv[])
{
    auto isInt = [](std::string_view str) -> bool {
        return std::all_of(str.cbegin(), str.cend(), ::isdigit);
    };

    for(auto &test : {"abc", "123abc", "123.0", "+123", "-123", "123"}) {
        std::cout << "Is '" << test << "' numeric? "
            << (isInt(test) ? "true" : "false") << std::endl;
    }

    return 0;
}

使用 Godbolt 查看结果。

原文由 Phidelux 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题