如何检查字符串是否正确以将其转换为 int?
How to check is string correct to convert it to int?
下面只讲stl函数。不是这样的:
for (char c : s) {
if (c < '0' || c > '9') {
return false;
}
}
我认为没有内置函数可以执行此操作,但您可以使用算法来执行此操作:
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 */ }
你可以用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
的 return 值并针对 INT_MAX
和 INT_MIN
.
进行测试
此选项与 std::stoi
的不同之处在于后者不提供有关有效数字后是否有其他尾随字符的任何信息(例如 3x
和 3
都会 return 3
)。
下面只讲stl函数。不是这样的:
for (char c : s) {
if (c < '0' || c > '9') {
return false;
}
}
我认为没有内置函数可以执行此操作,但您可以使用算法来执行此操作:
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 */ }
你可以用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
的 return 值并针对 INT_MAX
和 INT_MIN
.
此选项与 std::stoi
的不同之处在于后者不提供有关有效数字后是否有其他尾随字符的任何信息(例如 3x
和 3
都会 return 3
)。