- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在处理需要将字符串转换为长数字的应用程序时,atol() 和 strtol() 无法正确转换任何大于 9 位数字的字符串。
strtol 会提示一个与字符串无关的数字,而 atol 会提示一个负数(溢出)。
知道为什么会这样吗?我该如何解决?
最佳答案
这听起来像您系统上的 long
是一个 32 位值。这意味着任何高于 4,294,967,295 的无符号数都不会正确转换,也不会正确转换高于 2,147,483,647 或低于 2,147,483,648 的有符号数。
一般来说,n 位表示可以表示范围 [-2n-1,-2n-1) 或范围 [0,2n) 内的无符号数。
维基百科文章 Computer numbering formats可能是了解有关此行为的更多信息的良好起点。
您从 atol()
和 strtol()
中看到不同结果的原因是它们具有不同的错误处理特性。来自strtol()
man page :
The
strtol()
function returns the result of the conversion, unless the value would underflow or overflow. If an underflow occurs,strtol()
returnsLONG_MIN
. If an overflow occurs,strtol()
returnsLONG_MAX
. In both cases,errno
is set toERANGE
.
并且来自 atol()
man page :
The
atoi()
function converts the initial portion of the string pointed to bynptr
to int. The behaviour is the same asstrtol(nptr, (char **)NULL, 10);
except that
atoi()
does not detect errors.The
atol()
andatoll()
functions behave the same asatoi()
, except that they convert the initial portion of the string to their return type oflong
orlong long
.
关于c - strtol() 和 atol() 不转换大于 9 位的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4972378/
这个问题在这里已经有了答案: Where did the name `atoi` come from? (2 个答案) 关闭 5 年前。 有谁知道将字符串转换为长整数的函数 atol 的名称来源是什
正如 this 的评论中所建议的那样问题,我将其用作哈希函数: atol(phone) % buckets 但是,对于我所有的电话号码,我从 atol() 得到了完全相同的结果!我删除了前两位数字(在
在执行时间上有什么好的方法可以优化这个函数吗?我的最终目标是解析一个由几个整数组成的长字符串(每行几千个整数,上千行)。这是我最初的解决方案。 int64_t get_next_int(char *n
这是我使用的代码。我通常会收到一个名为“Run-Time Check Failure #2 - Stack around the variable 'string' was corrupted.”的错
atol() 和 strtol() 有什么区别? 根据他们的手册页,它们似乎具有相同的效果以及匹配的参数: long atol(const char *nptr); long int strtol(c
我正在使用 cygwin 并尝试使用以下命令编译文件。 $g++ -std=c++0x test.cpp -o test 但 cygwin 告诉我环礁未定义。然后google了一下,发现是cygwin
这个问题在这里已经有了答案: How to access a local variable from a different function using pointers? (10 个答案) 关闭
我正在尝试调试以便我可以托管游戏服务器这是我遇到的下一个错误。我使用 Linux 的时间很短,不知道从这里到哪里去。 这是我正在处理的错误: server $ make gcc -Wall -Wsha
在 atollic 中处理嵌入式 c++/c 项目时(eclipse 也一样),在项目设置下,您有: > Assembler (arm-atollic-eabi-gcc -c) > C Compile
我一直在使用 cstdlib 中的 std::atoll 通过 gcc 将字符串转换为 int64_t。该功能似乎在 Windows 工具链上不可用(使用 Visual Studio Express
在 Ubuntu 12.04 下,并且可能使用 x86 32 位汇编和 C 库,我需要使用一个数字 n 2^31 - 1 < n <= 2^63 -1 在我的系统上,C 整数是 3
这个问题在这里已经有了答案: Where did the name `atoi` come from? (2 个答案) 关闭 6 年前。 我理解上述函数的作用,但我无法猜测它们的名称是如何创建的,除
我正在尝试使用 pandas 的测试库比较两个数据帧。我不希望测试通过的值完全相同,所以我使用 atol 参数。Atol 指定允许的绝对公差。但是,当要比较的值变高时,即使超过容差阈值,测试也会通过。
在处理需要将字符串转换为长数字的应用程序时,atol() 和 strtol() 无法正确转换任何大于 9 位数字的字符串。 strtol 会提示一个与字符串无关的数字,而 atol 会提示一个负数(溢
下面的代码给出了 2147483647 的输出。如果if(atol(str) #include int main() { unsigned long l = 100; unsign
这几天我在玩atol()、atof() 和atoi() 的C 函数,从一篇博文中我找到了一个教程并应用了: 这是我的结果: void main() { char a[10],b[10];
我正在尝试使我的 python2.x-Code 与 2.7 和 3.x 兼容。目前我被困在 Pmw.py 中的一些代码(来自 python megawidgets)。看看这本词典的前三个词条: _st
如何在 scipy.integrate.ode 中找到默认参数?具体来说,atol 和 rtol in integrator dopri5?可以使用 set_integrator 方法设置参数,但如果
这里 scipy.integrate.odeint 被调用了六个不同的标准 ode 问题,rtol = atol 来自 1E-06 到 1E-13。我查看了所有较大公差减去最小公差的结果之间的最大差异
我想将 char16_t 转换为整数和/或长整数。 const char16_t* t = u"12"; long lt = atol( t); 这样的功能不存在吗? 最佳答案 试试这个函数:(它不一
我是一名优秀的程序员,十分优秀!