模拟实现atoi函数

    xiaoxiao2021-03-25  150

    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 0 if (((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"); else printf("异常\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"));//正常 输出123 PrintState(); printf("value=%d ", my_atoi("+123.456789"));//正常 输出123 PrintState(); 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; }

    转载请注明原文地址: https://ju.6miu.com/read-4629.html

    最新回复(0)