atoi函数不同平台的实现问题
工程中要通过文件得到数值,想当然的就使用了atoi这个函数。在
Windows下使用,没什么问题。但是一移植到Linux下,问题就出来了,
发现得到的数总是不对劲。用gdb跟踪一下,发现大于2147483647的数
均返回2147483647这个值。又在Windows下debug了一下,发现得到的数
值正常,能够得到大于2147483647的数。
这就比较有趣了,2147483647十六进制表示是0x7FFFFFFF。应该是
越界问题。查了一些资料,发现gcc在实现atoi函数的时候,如果输入
的字符串数值大于int型最大值将返回INT_MAX(2147483647)这个值。
又在Windows下,使用VS.net2003测试了一下,发现数值在2^31~
2^32-1之间,返回正常的数,而大于2^32-1将返回模2^32的数。
VS.net2003内部实现atoi函数使用了取模操作,以2^32为模。而
gcc使用了截断操作,以2^31-1为界,超过同一返回2^31-1。
因此,使用atoi函数就需要小心些。而且atol函数跟atoi函数一
样,测试结果一样。
为了支持得到超过2^31-1的数,在Linux下就必须使用strtoul这
个函数。
unsigned long strtoul(
const char *nptr,
char **endptr,
int base
);
这个函数功能比atoi强大的多,第一个参数是需要转换的字符串,
第二个参数是扫描结束时指向的位置,从而可以用来获知有没有转换
溢出,第三个参数是进制,支持2~64之间任意一个。这样就可以知道
转换了多少个字符。
PS:
又用VS.net2005测试过,发现atoi返回的结果已经跟Linux一致了,
即大于INT_MAX时,返回INT_MAX。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/BlueSoal/archive/2006/06/04/772920.aspx
分享到:
相关推荐
用C实现atoi,字符转整型。。。。。。
在上面的代码中,我们可以看到两个不同的 atoi 函数实现,下面我们将逐一分析它们。 第一个 atoi 函数实现 在第一个 atoi 函数实现中,我们可以看到它的参数是一个指向字符数组的指针 `str`。函数的主要任务是将...
以下是一个简单的`atoi`函数实现: ```cpp int my_atoi(const char *str) { int result = 0; bool is_negative = false; int base = 10; // 跳过前导空格 while (*str && isspace(*str)) { str++; } // ...
atoi函数的实现 用C语言写的 很简单的 大家可以参考下
自己实现了atoi函数,有2个版本的实现,卸载txt里面,见谅
atoi函数的实现可以使用以下代码: ```c int atoi (char s[]){ int i,n,sign; for(i=0; isspace(s[i]); i++); // 跳过空白符 sign=(s[i]=='-')?-1:1; if(s[i]=='+'||s[i]=='-') // 跳过符号 i++; for(n=0; ...
### atoi函数原型与实现 在C语言中,`atoi`函数是一种常见的字符串到整数的转换函数,广泛应用于各种程序中。本篇文章将基于提供的代码片段深入探讨`atoi`函数的实现原理及其在实际开发中的应用。 #### atoi函数...
在实现atoi函数时,需要注意指针为NULL、字符串为空字符串、空白字符、正号与负号问题、溢出问题、异常字符处理等几个重要的点。 2. 指针为NULL的处理:在实现atoi函数时,需要检查指针是否为NULL,如果是NULL,则...
函数说明:atoi函数会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。 例如: ```c #include int main() { char ...
以下是atoi函数的基本实现: ```c int atoi(const char *str) { int result = 0; int sign = 1; while (*str == ' ') { // 跳过前导空格 str++; } if (*str == '-') { sign = -1; str++; } else if (*...
自己写的一个字符串转整型的函数,实现了atoi()功能。
atoi函数详解 `atoi`函数的主要作用是从一个字符串中解析出一个整数。其原型通常如下: ```c int atoi(const char *nptr); ``` `atoi`函数的工作原理是扫描传入的字符串`nptr`,跳过所有前导空白字符,然后查找...
// 自定义的atoi函数 int my_atoi(const char* str) { int result = 0; bool negative = false; if (*str == '-') { negative = true; str++; } while (*str >= '0' && *str ) { result = result * 10 + (*...
总的来说,这个源码包提供了一个深入研究C语言核心函数实现的宝贵机会,对于提升编程技能、理解系统级编程和优化代码性能都大有裨益。对于想要从事系统编程、嵌入式开发或对C语言底层机制感兴趣的开发者来说,这是一...
阿托伊标准C库的函数的示例实现。入门本节介绍如何设置项目所需的构建环境。 该项目已经过 20.10上的GCC 10和Clang 11的C ++编译器测试。 使用以下命令至少安装这些编译器之一。 海湾合作委员会10 ➜ sudo apt -y ...
在C/C++编程语言中,`atoi`、`strcat`和`strcpy`是三个非常基础且常用的字符串处理函数。这些函数在标准库`<cstdlib>`(C++)或`<stdlib.h>`(C)中定义,但在某些情况下,开发者可能需要自行实现它们,以更好地理解...
C语言itoa()函数和atoi()函数详解 C语言提供了几个标准库函数,可以将任意类型(整型、长整型、浮点型等)的数字转换为字符串。其中,itoa()函数和atoi()函数是两个常用的函数,分别将整数转换为字符串和将字符串...
1. **溢出问题**:在实现`MyAtoi()`时要注意处理整数溢出的情况,例如当输入的数字过大时可能导致程序异常。 2. **空指针检查**:在调用`myStrcpy()`前应确保两个字符串指针均非空,避免运行时错误。 3. **性能优化*...
`itoa` 和 `atoi` 函数的这种自定义实现方式,虽然不如标准库中的版本高效,但对于学习和理解转换过程非常有帮助。 总结一下,`atoi()` 和 `itoa()` 函数在C语言编程中起着关键作用。`atoi()` 从字符串中提取整数,...