另一个版本...
使用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
的姐妹函数(strtod
、strtoul
等)的描述。