作者:321 | 来源:互联网 | 2023-01-11 17:20
我尝试使用最小缓冲区std::snprintf
转换uint64_t
为std::string
并在转换后的字符串中找到大值的错误
#include
#include
#include
#include
#include
// assume this is maximum string size to represent any unsigned integer
// with 1 extra byte for string terminating null character
const std::size_t MAX_UINT64_WIDTH =
std::numeric_limits::digits10 + 1;
int main(int, char**)
{
uint64_t value = 10244450920698242790ULL;
const std::string svalue = "10244450920698242790";
std::string str;
char buf[MAX_UINT64_WIDTH];
auto l = std::snprintf(buf, MAX_UINT64_WIDTH, "%" PRIu64, value);
if (l > 0) {
str.assign(buf, buf + l);
}
assert(svalue == str); //assertion failed, the last character '0' (0x30) is replaced with '\0' (0x00)
return 0;
}
然后我发现assert(21 == MAX_UINT64_WIDTH);
也失败了.最后,最小程序出现错误
#include
#include
#include
#include
int main(int, char**) {
std::cout <::max() <::digits10 <::max()).size() <
更新
我滥用库,digits10
所以我重命名我的问题.
1> formerlyknow..:
digits10
是您可以"安全"存储在该类型中的数字的位数.例如,如果std::numeric_limits::max()
是,18446744073709551615
那么您不能存储具有相同位数的数字,并且所有数字都等于9 uint64_t
.
可以说,如果max
有N
数字,那么digits10
通常是N-1
(除非max
是99999 ... 9999).