模拟实现库函数atoi,将字符串转换成数字。
库函数atoi函数原型:int atoi(const char *str );
该函数在平时我们经常应用,但对该函数内部的一些判断缺少深刻的了解。
如果我们直接按最基本的功能完成此函数则代码如下(没有任何错误判断):
int my_atoi(const char* str){ long long num = 0; while (*str != '/0') { num = num * 10 + (*str - '0'); str++; } return (int)num; }此函数能完成如“1234”这类字符串的转换,但是若输入“-1234”便不能识别。缺点: 1、不能判断正负;
2、不能越过空格;
3、若返回0,不能分清是非法字符还是字符串本身是0;
4、没判断参数字符指针是否合法。
所以我们要解决以上的缺点,需要修改和优化并得到以下代码:
#include<stdio.h>#include<stdlib.h>#include<ctype.h>enum START{ KVALID, //0 合法 KINVALID //1 非法};enum START start = KVALID; //定义全局变量,方便其他函数检测状态int my_atoi(const char* str){ start = KINVALID; long long num = 0; if (str != NULL && *str != '/0') { int flag = 1; //正负标志位 if (*str == '+') { str++; } else if (*str == '-') { str++; flag = -1; } while (*str != '/0') //循环到字符串结尾结束(正常退出) { if (isdigit(*str)) { num = num * 10 + flag * (*str - '0'); if (num > INT_MAX || num < INT_MIN) //判断是否溢出(以整型为溢出标准) { num = 0; return (int)num; //此时返回0,且在非法状态(溢出) } str++; } else if (isspace(*str)) { str++; //将空格跳过 } else { break; //若遇到0到9外的其他字符,跳出循环(非法状态) } if (*str == '/0') { start = KVALID; //正常转换完,状态置成合法 } } } return (int)num; //此时返回0,状态不确定}int main(){ char* str = "- 012@3"; int x = my_atoi(str); PRintf("%d/n",x); return 0;}输出结果:
新闻热点
疑难解答