如何检查字符串是不是正确以将其转换为 int?
Posted
技术标签:
【中文标题】如何检查字符串是不是正确以将其转换为 int?【英文标题】: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
【参考方案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 */
【讨论】:
这将允许前导零,这可能没问题 前导零应该没问题。它不会处理负面的int
s,但 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_MAX
和INT_MIN
进行测试。
此选项与std::stoi
的不同之处在于后者不提供任何关于有效数字后是否有其他尾随字符的信息(例如3x
和3
都将返回3
)。
【讨论】:
以上是关于如何检查字符串是不是正确以将其转换为 int?的主要内容,如果未能解决你的问题,请参考以下文章
如何将字符串转换为 NSData 以将其传递给 BLE 设备?
如何检查字符串是不是能够转换为 float 或 int [重复]
手动将字符串转换为 int 并检查 C/C++ 中是不是发生溢出?