atof 和atoi 的模拟实现

           atof 和 atoi 其实就是解析一段字符串。

    下面是将字符串解析成浮点数需要考虑的格式:(注意,下面考虑的所有东西可能不存在字符串中)

①删除无意义的空格

②考虑该字符串的符号

③解析第一段正文(假如遇到不合法字符,那么解析到此结束;否则继续往下解析)

④看是否有小数点

⑤解析第二段正文

⑥看是否存在e/E

⑦假如存在e/E,那么就开始判断指数的符号和指数的大小


double my_atof(const char *str)
{
	//"               +34555.444e+4"
	//"无意义的空格  +/ /- 正文 . 正文 e +/ /- 正文"
	double s = 0.0, d = 10.0, flag = 1.0;
	int count = 0;
	while (*str == ' ')str++;//① 跳过无效空格
	if (*str == '-'){ flag = -1.0; str++; }//② 判断符号
	else if (*str == '+'){ str++; }

	while (*str >= '0' && *str <= '9')//③ 判断第一段正文
	{
		s = s * 10 + *str - '0';
		str++;
	}
	if (*str == '.')//④ 判断是否存在点
		str++;
	while (*str >= '0' && *str <= '9')//⑤ 判断第二段正文
	{
		s += (*str - '0') / d;
		d *= 10.0;
		str++;
	}
	if (*str == 'e' || *str == 'E')//⑥ 判断是否存在e/E
	{
		str++;
		if (*str == '+')//⑦ 在⑥成立的情况下判断指数的符号以及大小
		{
			str++;
			while (*str >= '0' && *str <= '9')
			{
				count = count * 10 + *str - '0';
				str++;
			}
			while (count--)
				s *= 10.0;
		}
		if (*str++ == '-')//⑦ 在⑥成立的情况下判断指数的符号以及大小
		{
			while (*str >= '0' && *str <= '9')
			{
				count = count * 10 + *str - '0';
				str++;
			}
			while (count--)
				s /= 10.0;
		}
	}
	return s*flag;
}

   

下面是将字符串解析成整型数需要考虑的格式:(注意,下面考虑的所有东西可能不存在字符串中)


①删除无意义的空格

②考虑该字符串的符号

③解析第一段正文(假如遇到不合法字符,那么解析到此结束;否则继续往下解析)

int my_atoi(const char*str)
{
	int s = 0, flag = 1;
	while (*str == ' ')
		str++;
	if (*str++ == '-')
		flag = -1;
	while (*str >= '0' && *str <= '9')
	{
		s = s * 10 + *str - '0';
		str++;
	}
	return s*flag;
}




猜你喜欢

转载自blog.csdn.net/qq_39290388/article/details/79948104