首页 > 学院 > 开发设计 > 正文

模拟实现库函数atoi

2019-11-08 03:04:30
字体:
来源:转载
供稿:网友

模拟实现库函数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;}输出结果:


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表