【问题标题】:How to check is string correct to convert it to int?如何检查字符串是否正确以将其转换为 int?
【发布时间】:2020-05-20 21:40:26
【问题描述】:

现在我只讨论 stl 函数。不是这样的:

for (char c : s) {
  if (c < '0' || c > '9') {
    return false;
  }
}

【问题讨论】:

  • 别忘了isdigit()
  • 你需要容纳负值吗?
  • @tadman,不,我不需要。
  • 您可以尝试strtol 并检查errno

标签: c++ string int


【解决方案1】:

我不相信有一个内置函数可以做到这一点,但你可以使用算法来做到这一点:

bool is_valid_int(const std::string& s)
{
    return std::all_of(std::begin(s), std::end(s), 
                         [](unsigned char c) { 
                           return std::isdigit(c); 
                       });
}

请注意,此解决方案仅检查字符串的所有字符是否都是数字。要检查它是否可转换为 int,您可以执行以下操作:

int n;
try { n = std::stoi(s); }
catch(...) { /* do something */ }

【讨论】:

  • 这将允许前导零,这可能没问题
  • 前导零应该没问题。它不会处理负面的ints,但 OP 似乎可以接受。
  • 仅仅因为 string 包含所有数字字符并不能保证它会成功转换为 int。它可能包含比int 可以处理的更多数字。实际上,通过stoi()strtol() 或等效项将string 转换为int,并检查转换是否失败,是最好的选择。
  • @RemyLebeau true,添加了该选项。虽然没有算法那么有趣;)
【解决方案2】:

您可以使用strtol 进行转换,然后检查整个字符串是否被消耗,例如:

bool string_is_valid(std::string s)
{
    char const *startptr = s.c_str();
    char *endptr;
    strtol(startptr, &endptr, 10);

    return endptr - startptr == s.size();
}

无论转换是否成功,始终设置endptr

如果区分long 正确但int 超出范围的值很重要,那么您需要存储strtol 的返回值并针对INT_MAXINT_MIN 进行测试。

此选项与std::stoi 的不同之处在于后者不提供任何关于有效数字后是否有其他尾随字符的信息(例如3x3 都将返回3)。

【讨论】:

    猜你喜欢
    • 2017-09-12
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 2011-02-20
    • 2016-08-05
    相关资源
    最近更新 更多