标准库函数atoi的实现

标准库函数atoi用于将字符串类型的数据转换为整形数据:在转换过程中要考虑空指针、空字符串""、正负号,溢出等情况

这里是将字符串str转换为32位整型,其正数的最值为0x7FFFFFFF,负数的最小值为0x80000000(可参考有符号类型的最小负数的补码的由来),通过这两个值来判断是上溢还是下溢,此外,用一个全局变量来表明是否是非法输入的问题。

代码如下:(vs2010调试正确)

 1 //实现atoi_32函数
 2 //正数数的最大值为0x7FFFFFFF,最小值为0x80000000,考虑数字会溢出的情况
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5 #include <ctype.h>
 6
 7 enum {kValid = 0,kInvalid};
 8 int g_nStatus = kValid;  //全局变量用于判断是非法输入还是字符串为空
 9
10 long long StrToInt(const char *s,int sign)
11 {
12     long long num = 0;
13     while(*s != ‘\0‘){
14         if(!isdigit(*s)){
15             g_nStatus = kInvalid;  //表示非法输入
16             num = 0;
17             break;
18         }
19         num = num * 10 + *s - ‘0‘;
20         if(sign > 0 && sign * num > 0x7FFFFFFF ||
21             sign < 0 && sign * num < (signed int)0x80000000){  //注意这里的类型提升,因此要强制转换
22             num = 0;
23             break;
24         }
25         s++;
26     }
27     return sign * num;
28 }
29 int atoi_32(const char *s)
30 {
31     long long num;
32     int sign;
33     sign = 1;
34
35     if(s == NULL || *s == ‘\0‘){
36         return 0;
37     }
38     if(*s == ‘+‘)
39         ++s;
40     else if (*s == ‘-‘){
41         ++s;
42         sign = -1;
43     }
44     if (*s == ‘\0‘){
45         g_nStatus = kInvalid;  //表示非法输入
46         return 0;
47     }
48     else
49         num = StrToInt(s,sign);
50
51     return (int)num;
52 }
53
54 int main()
55 {
56     char s[1024];
57     gets(s);
58     printf("%d\n",atoi_32(s));
59     system("pause");
60     return 0;
61 }
时间: 2024-10-11 22:47:23

标准库函数atoi的实现的相关文章

C语言提供了几个标准库函数 itoa() atoi()

C语言提供了几个标准库函数C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串.以下是用itoa()函数将整数转换为字符串的一个例子: # include <stdio.h> # include <stdlib.h> void main (void) { int num = 100; char str[25]; itoa(num, str, 10); printf("The number 'num' is %d and the strin

C语言中最常用标准库函数

标准头文件包括: <asset.h>      <ctype.h>       <errno.h>       <float.h> <limits.h>      <locale.h>       <math.h>        <setjmp.h> <signal.h>     <stdarg.h>      <stddef.h>      <stdlib.h>

库函数atoi()的实现

int atoi(const char *nptr); 如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整形数.否则,返回零. 这里需注意:如果字符串是非法输入:字符串为空,只有一个'+'或'-',非数字等返回的是整形数0:而如果输入是"0",返回的也是整形数0.对于这样的情况,atoi()是通过一个全局变量来区分的.还有一点:比如输入是"123abc",则atoi()也能正确执行,返回整形数12

C/C++语言的标准库函数malloc/free与运算符new/delete的区别

概括地说 1.malloc与free是C++/C的标准库函数,new/delete是C++的运算符,它们都可用于申请动态内存和释放内存. 2.对于非内部数据类型的对象而言,只用malloc/free无法满足动态对象的要求.对象在创建的同时,要自动执行构造函数,对象在消亡之前要自动执行析构函数.而由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free. 3.因此C++语言需要一个能完成动态内存分配和初始化工作的运算符

【C语言】编写函数实现库函数atoi,把字符串转换成整形

//编写函数实现库函数atoi,把字符串转换成整形 #include <stdio.h> #include <string.h> int my_atoi(const char *src) { int flag=1; int sum=0; while (*src) { if (*src == ' ') src++; else if (*src == '+') { src++; flag = 1; } else if(*src == '-') { src++; flag = -1; }

范围for语句 &amp;&amp; 列表初始值&amp;&amp; 标准库函数begin和end

范围for语句: 引入的意义:简化传统for的编写,主要用于遍历给定序列中的每个元素并对序列中的每个值执行某种操作,其语法形式是: for( 声明: 给定序列) { 执行的操作. } 其中,“给定序列”部分是一个对象,如一个string的对象.“声明”部分用于定义一个变量,该变量将被用于访问序列中的基础元素.每次迭代,“声明”部分的变量会被初始化为“给定序列”部分的下一个元素值. 一个范围for循环的简单例子: 1 string str(“some string”); 2 for(auto c:

文件I/O之C标准库函数和系统库函数区别

1.首先C标准库函数是工作在系统库函数之上的.C标准库函数在读写文件时候都有一个文件流指针.FILE*fp=NULL;// fp=fopen(F_PATH,"r"); fp文件流指针,其指向结构体如下图所示. 文件描述符指向磁盘文件,在进行文件读写操作时候是先读写到缓冲区,然后再调用系统应用层API write函数进行写操作,write将文件内容写到内核缓冲区,然后再调用内核层API sys_write进行写操作.到这样可以减少I/O操作,提高读写操作. 值得说明的是:使用C语言标准库

C++/C语言的标准库函数与运算符的区别new/delete malloc/free

malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存.下面来看他们的区别. 一.操作对象有所不同 malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求. 对象在创建的同时要自动执行构造函数,对象消亡之前要自动执行析构函数.由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能把执行构造函数

转载 C++常用库函数atoi,itoa,strcpy,strcmp的实现

C++常用库函数atoi,itoa,strcpy,strcmp的实现 C语言字符串操作函数 1. 字符串反转 - strRev2. 字符串复制 - strcpy3. 字符串转化为整数 - atoi4. 字符串求长 - strlen5. 字符串连接 - strcat6. 字符串比较 - strcmp7. 计算字符串中的元音字符个数8. 判断一个字符串是否是回文1. 写一个函数实现字符串反转 版本1 - while版 void strRev(char *s){    char temp, *end