另一个版本...
使用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等)的描述。