atof and atoi
2016-03-15 16:35
405 查看
#include <iostream>
#include <cstdlib>
#include <ctype.h>
using namespace std;
/*
* @brief: 转换输入的字符串到长整形数
* 过滤字符串开始的空格、+-号,逐个遍历数字字符,直到字符串末尾、
* 非数字,也可以支持E(e)指数字符串
* @input: nptr, const char*, 输入的字符串
* @return: long
*/
long myatoi(const char* nptr)
{
double dRet = 0;
if(!nptr)
return dRet;
int nVal1 = 0,nVal2 = 0;
int nSign = 1;
int i = 0;
// 过滤空格
for(; isspace(nptr[i]); ++i);
// 判断+-
if(nptr[i] == '-')
{
++i;
nSign = -1;
}else if(nptr[i] == '+')
{
++i;
}
// e或者.之前的整数部分
for(; ::isdigit(nptr[i]); ++i)
{
nVal1 = nVal1 * 10 + (nptr[i] - '0');
}
if((nptr[i] == 'e') || (nptr[i] == 'E')) // 是e的情况
{
int nSign2 = (nptr[++i] == '-') ? -1 : 1;
// e-, e+,e
if( (nptr[i] == '-') || (nptr[i] == '+') )
++i;
for(; ::isdigit(nptr[i]); ++i)
{
nVal2 = nVal2 * 10 + (nptr[i] - '0');
}
if(nSign2 == 1)
{
dRet = nVal1 * ::pow(10.0,nVal2);
}else{
dRet = nVal1 / ::pow(10.0,nVal2);
}
}else{
dRet = nSign * nVal1;
}
return dRet;
}
/*
* @brief: 转换输入的字符串到浮点型数
* 过滤字符串开始的空格、+-号,逐个遍历数字字符,直到字符串末尾、
* 非数字,也可以支持E(e)指数字符串
* @input: nptr, const char*, 输入的字符串
* @return: double
*/
double myatof(const char* nptr)
{
double dRet = 0;
if(!nptr)
return dRet;
int nVal1 = 0,nVal2 = 0;
int nSign = 1;
int i = 0;
// 过滤空格
for(; isspace(nptr[i]); ++i);
// 判断+-
if(nptr[i] == '-')
{
++i;
nSign = -1;
}else if(nptr[i] == '+')
{
++i;
}
// e或者.之前的整数部分
for(; ::isdigit(nptr[i]); ++i)
{
nVal1 = nVal1 * 10 + (nptr[i] - '0');
}
if(nptr[i] == '.') // 是.的情况
{
// .之后的整数部分
int num = 0;
for(++i; ::isdigit(nptr[i]); ++i)
{
nVal2 = nVal2 * 10 + (nptr[i] - '0');
++num;
}
dRet = nSign * (nVal1 + nVal2 /::pow(10.0,num) );
}else if((nptr[i] == 'e') || (nptr[i] == 'E')) // 是e的情况
{
int nSign2 = (nptr[++i] == '-') ? -1 : 1;
// e-, e+,e
if( (nptr[i] == '-') || (nptr[i] == '+') )
++i;
for(; ::isdigit(nptr[i]); ++i)
{
nVal2 = nVal2 * 10 + (nptr[i] - '0');
}
if(nSign2 == 1)
{
dRet = nVal1 * ::pow(10.0,nVal2);
}else{
dRet = nVal1 / ::pow(10.0,nVal2);
}
}else{
dRet = nVal1;
}
return dRet;
}
int main(void)
{
cout<<myatoi("-2.5678")<<endl;
cout<<myatoi("2.5678")<<endl;
cout<<myatof(" 2.5a678")<<endl;
cout<<myatoi("8e-1")<<endl;
cout<<myatoi("8E3")<<endl;
system("pause");
}
#include <cstdlib>
#include <ctype.h>
using namespace std;
/*
* @brief: 转换输入的字符串到长整形数
* 过滤字符串开始的空格、+-号,逐个遍历数字字符,直到字符串末尾、
* 非数字,也可以支持E(e)指数字符串
* @input: nptr, const char*, 输入的字符串
* @return: long
*/
long myatoi(const char* nptr)
{
double dRet = 0;
if(!nptr)
return dRet;
int nVal1 = 0,nVal2 = 0;
int nSign = 1;
int i = 0;
// 过滤空格
for(; isspace(nptr[i]); ++i);
// 判断+-
if(nptr[i] == '-')
{
++i;
nSign = -1;
}else if(nptr[i] == '+')
{
++i;
}
// e或者.之前的整数部分
for(; ::isdigit(nptr[i]); ++i)
{
nVal1 = nVal1 * 10 + (nptr[i] - '0');
}
if((nptr[i] == 'e') || (nptr[i] == 'E')) // 是e的情况
{
int nSign2 = (nptr[++i] == '-') ? -1 : 1;
// e-, e+,e
if( (nptr[i] == '-') || (nptr[i] == '+') )
++i;
for(; ::isdigit(nptr[i]); ++i)
{
nVal2 = nVal2 * 10 + (nptr[i] - '0');
}
if(nSign2 == 1)
{
dRet = nVal1 * ::pow(10.0,nVal2);
}else{
dRet = nVal1 / ::pow(10.0,nVal2);
}
}else{
dRet = nSign * nVal1;
}
return dRet;
}
/*
* @brief: 转换输入的字符串到浮点型数
* 过滤字符串开始的空格、+-号,逐个遍历数字字符,直到字符串末尾、
* 非数字,也可以支持E(e)指数字符串
* @input: nptr, const char*, 输入的字符串
* @return: double
*/
double myatof(const char* nptr)
{
double dRet = 0;
if(!nptr)
return dRet;
int nVal1 = 0,nVal2 = 0;
int nSign = 1;
int i = 0;
// 过滤空格
for(; isspace(nptr[i]); ++i);
// 判断+-
if(nptr[i] == '-')
{
++i;
nSign = -1;
}else if(nptr[i] == '+')
{
++i;
}
// e或者.之前的整数部分
for(; ::isdigit(nptr[i]); ++i)
{
nVal1 = nVal1 * 10 + (nptr[i] - '0');
}
if(nptr[i] == '.') // 是.的情况
{
// .之后的整数部分
int num = 0;
for(++i; ::isdigit(nptr[i]); ++i)
{
nVal2 = nVal2 * 10 + (nptr[i] - '0');
++num;
}
dRet = nSign * (nVal1 + nVal2 /::pow(10.0,num) );
}else if((nptr[i] == 'e') || (nptr[i] == 'E')) // 是e的情况
{
int nSign2 = (nptr[++i] == '-') ? -1 : 1;
// e-, e+,e
if( (nptr[i] == '-') || (nptr[i] == '+') )
++i;
for(; ::isdigit(nptr[i]); ++i)
{
nVal2 = nVal2 * 10 + (nptr[i] - '0');
}
if(nSign2 == 1)
{
dRet = nVal1 * ::pow(10.0,nVal2);
}else{
dRet = nVal1 / ::pow(10.0,nVal2);
}
}else{
dRet = nVal1;
}
return dRet;
}
int main(void)
{
cout<<myatoi("-2.5678")<<endl;
cout<<myatoi("2.5678")<<endl;
cout<<myatof(" 2.5a678")<<endl;
cout<<myatoi("8e-1")<<endl;
cout<<myatoi("8E3")<<endl;
system("pause");
}
相关文章推荐
- CodeForces#5A. Chat Server's Outgoing Traffic
- Spring IOC容器基本原理
- Apache的虚拟主机配置
- 328. Odd Even Linked List
- 正确理解ThreadLocal
- Android中的MVC
- setTimeout()和setInterval()方法的区别
- 几种常见的排序算法及它们之间的比较
- Xamarin.Forms DataGrid
- Android 点击两次返回键 退出程序
- 控制反转与依赖注入
- 使用http代理上网,在hosts文件配置映射时应注意浏览器的代理设置
- Java 逻辑运算符
- 详解C语言求两个数的最大公约数及最小公倍数的方法
- 重启或杀掉Nginx进程后丢失nginx.pid的解决办法
- Java Collection笔记之ArrayList
- UVA 400 Unix is
- Linux进程与线程概述
- I2S音频总线学习(二)
- 如果时光倒流,你还愿遇见我吗?