0

任何人都知道为什么使用 strtoull 会超过 unsigned long long?当我拨打电话时,“x”的值为 12,所以我试图将 12 位基数 36 num 转换为 unsigned long long。

这应该有效吗?我编译 32 位还是 64 位都没有关系。我在redhat上使用g++。

缓冲区是一个字符*

char *strPtr = buffer + ORDERIDOFFSET;
char *endPtr = strPtr + ORDERIDLENGTH;
long x = long((endPtr)) - long(buffer + ORDERIDOFFSET);
unsigned long long orderid = strtoull((buffer + ORDERIDOFFSET), &(endPtr), 36);

谢谢!

4

2 回答 2

4

您似乎误解了endptr的输入参数strtoull,它告诉它输入字符串的长度。它不是。它是一个输出参数,strtoull用于告诉您它无法转换的第一个字符。

我认为您的缓冲区没有终止;您的 12 位 base-36 号码后面可能有一个字母数字字符。

顺便说一句,恕我直言,x最好计算为endPtr - strPtr。转换long为并不是真正正确的。

于 2013-10-31T18:22:58.113 回答
1

您似乎正在尝试endPtr用作输入参数。 std::strtoull将第二个参数作为输出参数。

您可能会发现使用它来std::stoull代替std::strtoull

char *strPtr = buffer + ORDERIDOFFSET;
char *endPtr = strPtr + ORDERIDLENGTH; // assuming ORDERIDLENGTH takes you 1 passed the end of the actual ID string
std::string s(strPtr, endPtr);
unsigned long long orderid = std::stoull(s, nullptr, 36);

此外,

long x = long((endPtr)) - long(buffer + ORDERIDOFFSET);

不能移植到 64 位系统(您会截断地址)。我很确定你想要

std::size_t x = endPtr - strPtr;
于 2013-10-31T18:32:58.343 回答