atof 和atoi 的模拟实现

10人阅读 评论(0) 收藏 举报
分类:

           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;
}




查看评论

atof(),atoi(),itoa(),sprintf()等用法总结

这几个都是C语言中原有的字符格式转换函数,包含在头文件或中,C++自然而然地也把它们加进来了。一、 atof()头文件#include/include原型:double atof(const char...
  • cxh342968816
  • cxh342968816
  • 2011-07-23 12:35:20
  • 13925

C语言实现atoi,itoa和atof

首先是atoi的实现,它的功能是将字符串转化为整数。 #include #include /* atoi : convert s to integer; version 2*/ int ...
  • li_canhui
  • li_canhui
  • 2011-09-25 21:12:37
  • 3645

C++ 类型转换 atoi atol atof itoa ftoa <stdlib.h>

1. atoi int atoi ( const char * str ); Convert string to integer Parses the C string str inter...
  • Vast_Sea
  • Vast_Sea
  • 2012-10-28 21:56:23
  • 4058

atoi函数和atof函数实现

本文对于最基本的功能,实现atoi和atof函数,对于含有e的次幂的字符串,只需要添加一部分单独处理即可。 atoi函数: #include #include #include "st...
  • u011491849
  • u011491849
  • 2013-09-08 20:55:58
  • 482

C语言atoi、atof、atol、atrtod,strtol和strtoul的汇总

相关函数 atof,atol,atrtod,strtol,strtoul 表头文件 #include
  • gdut2015go
  • gdut2015go
  • 2015-06-02 09:43:59
  • 4603

atoi和atof优化

在应用场景上,我们是全部正数,同时都是十进制的,因此相对glibc的实现上减少了很多冗余代码,新的代码中,centos64环境下,atoi提高了5倍,atof起码20倍 int my_atoi(co...
  • anghlq
  • anghlq
  • 2015-09-19 14:46:06
  • 1331

c字符串转换函数atoi、atof、atol

c开发中会常会借用一些函数来完成数字到字符串、字符串到数字的转换功能,下面列举几个常用到的字符串转换函数:1. atof 函数原型: double atof(const char *nptr) 头...
  • lixiaogang_theanswer
  • lixiaogang_theanswer
  • 2017-05-27 14:38:17
  • 290

Java中有atoi函数吗?

我们知道C++中有atoi函数,可以把一个表示数字的字符串转为int类型的数值。     那么我们就要问:Java中有atoi函数吗?     答案是没有,不过有类似与atoi功能的函数,...
  • puqutogether
  • puqutogether
  • 2015-03-17 17:33:09
  • 2009

常用的函数:atoi,itoa,atof,_ttoi等

atoi---ASCII to integer,将字符串转换成整形,从数字或正负号开始转换,一直到非数字为止 #include #include int main(void) { float...
  • zzyoucan
  • zzyoucan
  • 2013-08-24 12:36:04
  • 11252

98年的VC6到08年的VS2008-从atoi的用法差别看UNICODE的使用

由于平时写的较多的是工业设备程序,所以用的XP+VC6比较多,最近写一个小程序,用上了VS2008。之前也用过很长时间的VS2008,没出什么大问题,但是今天将之前在VC6上写的一个工作正常小接口程序...
  • wenzhou1219
  • wenzhou1219
  • 2013-12-17 22:03:47
  • 4015
    个人资料
    等级:
    访问量: 189
    积分: 134
    排名: 116万+
    文章分类
    文章存档
    最新评论