# include <stdlib.h>
int64_t value = atoll(some_string); // Lacks error checking. UB on overflow.
更好
long long v = strtoll(s, NULL, 0); // No reported errors, well defined on overflow.
Robust:创建一个帮助函数来检测所有问题。
# include <stdbool.h>
# include <ctype.h>
# include <errno.h>
# include <stdlib.h>
# include <stdint.h>
// Return error flag
bool my_strtoi64(int64_t *value, const char *s) {
// Maybe add a s==NULL, value==NULL checks.
char *endptr;
errno = 0;
long long v = strtoll(s, &endptr, 0);
// Optional code for future growth of `long long`
#if LLONG_MIN < INT64_MIN || LLONG_MAX > INT64_MAX
if (v < INT64_MIN) {
v = INT64_MIN;
errno = ERANGE;
} else if (v > INT64_MAX) {
v = INT64_MAX;
errno = ERANGE;
#endif
*value = (int64_t) v;
if (s == endptr) { // No conversion, v is 0
return true;
}
if (errno == ERANGE) { // Out of range
return true;
}
if (errno) { // Additional implementations specific errors
return true;
}
while (isspace(*(unsigned char* )endptr)) { // skip trailing white-space
endptr++;
}
if (*endptr) { // Non-numeric trailing text
return true;
}
return false; // no error
}
7条答案
按热度按时间rjjhvcjd1#
有几种方法可以做到这一点:
这与POSIX C99兼容。
您还可以使用strtoimax;其具有如下原型:
这很好,因为它将始终与本地intmax_t一起工作...这是C99,您需要包含
<inttypes.h>
iovurdzv2#
一次C99符合性尝试。
[编辑]就业@R.校正
k75qkfdt3#
来自网络搜索的用户也应该考虑
std::stoll
。对于
const char*
,它并没有严格有效地回答这个原始问题,但许多用户无论如何都会有一个std::string
。如果你不关心效率,你应该得到一个隐式转换(基于用户定义的转换,使用单参数std::string
构造函数)到std::string
,即使你有一个const char*
。它比
std::strtoll
简单,std::strtoll
总是需要3个参数。如果输入的不是数字,它应该会掷回,但请参阅这些注解。
gzszwxb44#
strtoll
将其转换为long long
,它通常是64位int。ltskdhd15#
100%可移植地实现这一点有点棘手。
long long
要求至少为64位,但不一定是二进制补码,因此它可能无法表示-0x7fffffffffffffff-1
,因此使用strtoll
时可能会有一个不完整的角大小写。(如果要允许前导空格)并首先检查符号,然后使用strtoull
或strtoumax
,这两种方法都需要支持最大为int64_t
的整个正值范围的值。然后可以应用符号:编写此逻辑是为了避免所有溢出情况。
a11xaf1n6#
如何将字符串转换为int64_t?
最简单的
更好
Robust:创建一个帮助函数来检测所有问题。
5tmbdcev7#
这对我使用不同的int64类型是有效的,我喜欢干净的C++风格:
您可能会收到编译错误:运算符〈〈...未定义。
如果argv[i]包含“HALLO”,我不知道会发生什么。