gpt4 book ai didi

c++ - 以正确的方式将字符串转换为整数

转载 作者:太空狗 更新时间:2023-10-29 21:37:04 24 4
gpt4 key购买 nike

我想验证字符串是否为有效整数。我可以只使用 64 位整数和像 std::stoullstd::stoll 这样的函数,但我无法验证该值是否在给定范围内。

例如,我想要一个介于 0 和 UINT64_MAX 之间的整数。如果字符串是 "-1",我可以将它转换为 long long,我会知道它是否定的。但是,如果字符串大于 signed long long 的最大值(通常为 INT64_MAX),当字符串为正整数时,溢出会再次使其为负数。

一位 friend 首先建议我检查减号,但我不喜欢这个解决方案,然后我考虑使用 double ,但我知道使用 double 进行比较可能很棘手,所以我对此不确定解决方案。

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;

最佳答案

您的函数不会出现您描述的错误,因为足够小的整数可以用 float 精确表示。因此,1 的转换不能是 0.99999,因为如果 0.99999 可以用 double 表示,它们是不同的数字。 0.999991 的转换是可能的。

但是,如果你有足够大的数字,限制检查就不起作用,因为 64 位 double 的小数部分比 64 位整数少(通常是 54,但这在标准中没有定义)。例如,以下程序的输出是 1 而不是 0,就好像它具有更高精度的数字一样。

#include <iostream>
#include <string>

int main(){
long long v=(1l << 54) +1;
std::cout << v-static_cast<long long>(std::stod(std::to_string(v))) << std::endl;
}

如果你真的需要接近 UINT64_MAX 的数字,最好使用像 Boost multiprecision 这样的库.它有一个任意精度的整数 cpp_int,可以从 std::string 构造。

关于c++ - 以正确的方式将字符串转换为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38487946/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com