【发布时间】:2016-07-20 18:15:17
【问题描述】:
我想验证字符串是否为有效整数。我可以只使用 64 位整数和函数,如 std::stoull 或 std::stoll,但我无法验证该值是否在给定范围内。
例如,我想要一个介于 0 和 UINT64_MAX 之间的整数。如果字符串是"-1",我可以将其转换为long long,我会知道它是否定的。但是,如果字符串大于 signed long long 的最大值(通常为INT64_MAX),则溢出使其再次为负,而字符串为正整数。
一位朋友首先建议我检查减号,但我不喜欢这个解决方案,然后我考虑使用双精度,但是我知道使用双精度进行比较可能会很棘手,所以这就是我不确定的原因解决方案。
template <typename T>
inline bool is_between(const string &str,
T min = numeric_limits<T>::min(),
T max = numeric_limits<T>::max()) noexcept
{
try {
double value = stod(str);
if (value < min || value > max)
return false;
} catch (...) {
return false;
}
return true;
}
这个功能安全吗?因为我怕一串“1”会返回一个double值“0.9999999999”,那么它就不适合1到100之间的区间了。
那么我们可以这样使用函数:
cout << is_between<uint16_t>("0") << endl;
cout << is_between<uint16_t>("65535") << endl;
cout << is_between<uint16_t>("65535", 0, 2000) << endl;
cout << is_between<uint16_t>("-1") << endl;
cout << is_between<uint16_t>("800000") << endl;
【问题讨论】:
-
为什么不把
min和max转成字符串做字符串比较呢? -
std::stoull 不会抛出异常吗?
-
@IInspectable 如果我没记错的话
std::stoull不会在输入为负数时抛出。 -
不,
std::stoull在使用“-1”调用时不会引发异常。 -
@NathanOliver:文档似乎同意你的看法。谈论一个完全避免采取最不意外的规范的规范......
标签: c++