/*
字符串转成实数
思路:先判断数据的正负,然后分二部分一部分正数,一部小数
*/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
double myatof(char *str)
{
/* 下的数据类型使用 double 精度更高,而使用 float 会有所差异,请自行验证 */
char *pstr = str;
double data = 0; /* 整数部分 */<span style="white-space:pre"> </span>
double xs = 1.0; /* 小数部分 */
double result = 1.0;
int flag = 1;
/* 判断,如果不符合转换的条件就返回 不太严密, 比如有 2 个小数点 。*/
while (*str != '\0')
{
if ((*str > '9' || *str < '0') && *str != '.' && *str != '-' && *str != '+')
return result;
str++;
}
/* 先判断符号位,如果有符号位,则指指向前移动指向数据 */
if (*pstr == '-')
{
flag = -1;
pstr++;
}
if (*pstr == '+')
{
pstr++;
}
/* 计算出整数部分 */
while (*pstr != '.')
{
data *= 10;
data += (*pstr - '0');
pstr++;
}
pstr++;
/* 计算小数部分 */
while (*pstr != '\0')
{
xs /= 10; /* 0.1 0.01 0.001 .... */
data += xs*(*pstr - '0'); /* 累加小数 */
pstr++;
}
result = data*flag;
return result;
}
void main()
{
char str[20] = "-1234.3456";
float num1;
double num2;
//num1 = atof(str);
//num2 = atof(str);
num1 = myatof(str);
num2 = myatof(str);
printf("num1:%3f\nnum2:%3f\n", num1,num2);
system("pause");
}
还没有评论,来说两句吧...