模拟实现atoi函数

来源:互联网 发布:淘宝引流最有效的方法 编辑:程序博客网 时间:2024/05/02 09:23

atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数,应用在计算机程序和办公软件中。

注意:

atoi( ) 函数会扫描参数 nptr字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过isspace( )函数来检测),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0 。转换后的结果要考虑是否溢出。

#include<stdlib.h>#include<stdio.h>#include<assert.h>enum{valid = 1,invalid = 0};int flag = valid;int my_atoi(const char* str){assert(str);long long ret = 0;int symbol = 1;//用于判断符号//判断是否为空字符if (*str == '\0'){flag = invalid;return 0;}//去掉空格,制表符while (isspace(*str)){str++;}//判断符号if ((*str == '-')){symbol = -1;str++;if (((*str < '0') || (*str > '9'))){flag = invalid;return 0;}}else if (*str == '+'){str++;}else if (((*str < '0') || (*str > '9'))){flag = invalid;return 0;}//处理完异常,开始转换while ((*str != '\0') && (*str >= '0') && (*str <= '9')){ret = ret * 10 + *str - '0';str++;}//带上符号ret *= symbol;//检测结果是否溢出//int 0111 1111 1111 1111 1111 1111 1111 1111 正溢出//     7     f    f   f     f    f    f    f//    1000 0000 0000 0000 0000 0000 0000 0000 负溢出//      8    0    0   0     0    0    0    0if (((ret > 0x7fffffff) && (symbol == 1)) ||(ret < (signed int)0x80000000) && (symbol == -1)){flag = invalid;return 0;}//ret合法flag = valid;return ret;}//打印输出是否异常void PrintState(){if (flag)printf("正常\n");elseprintf("异常\n");}void Test(){printf("value=%d ", my_atoi("123456789"));//正常PrintState();printf("value=%d ", my_atoi("-123456789"));//正常PrintState();printf("value=%d ", my_atoi("-123456789abc"));//正常,遇到字母终止PrintState();printf("value=%d ", my_atoi("    -123456789abc"));//正常,前面带空格PrintState();printf("value=%d ", my_atoi("abc123456789"));//异常,前面有字母PrintState();printf("value=%d ", my_atoi("-abc123456789"));//异常,前面有字母PrintState();printf("value=%d ", my_atoi("+abc123456789"));//异常,前面有字母PrintState();printf("value=%d ", my_atoi("123.456789"));//正常 输出123PrintState();printf("value=%d ", my_atoi("+123.456789"));//正常 输出123PrintState();printf("\n\n\n");printf("value=%d ", my_atoi(""), flag);//异常:空字符串PrintState();printf("value=%d ", my_atoi("123456789123456789"));//异常:正溢出PrintState();printf("value=%d ", my_atoi("-123456789123456789"));//异常:负溢出PrintState();printf("value=%d ", my_atoi("abcd"));//异常:无法转换PrintState();}int main(){Test();system("pause");return 0;}


0 0
原创粉丝点击