自己写了个关于atof的实现函数,但是只能的到整数和符号,不能得到小数,请大虾们帮忙!!

jakky520 2008-09-23 04:17:08
#include <stdio.h>
float decimal(char *q)
{
float dec=0.0f;
int j=1;
while(*q)
{
q++;
j*=10;
dec+=(*q-'0')/j;
}

return dec;

}

float atof(char *str)
{
int c;
int sign;
int number=0;
int j=1;
char *p=str;
//float decimal();
float dec;
while(*p) //截取整数部分
{
c=(int)(unsigned char)*p++;
while(c==' ')
{
++p;
}
sign=c;
if(c=='-'||c=='+')
c = (int)(unsigned char)*p++;
while(c>='0'&&c<='9')
{
number=number*10+(int)(c-'0');
c=(int)(unsigned char)*p++;
}
p++;
if(c=='.')
break;

}
dec =decimal(p);//截取小数部分 这个地方能得到p指针的地址吗?这个地址能穿到decimal函数去么?如果不能 怎么c传 ?

if(sign=='-')
return -(number+dec);
else
return (number+dec);
}


int main(void)
{
char *p="-98.321";
printf("%f",atof(p));
return 0;
}
...全文
271 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jakky520 2008-09-24
  • 打赏
  • 举报
回复
OK 搞定了
谢谢啦
给分了
太乙 2008-09-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jakky520 的回复:]
小弟稍微修改了下 ,还是有点点问题 只能得到小数点后面第二位以后的数字,小数点后第一位的不到 ,修改指针也没有 不知道怎么回事,整数部分没问题
#include <stdio.h>
float decimal(char *q)
{
float dec=0.0f;
float j=1.0f;
char *p = q++; //照理说应该会跳到小数点后第一位
while(*p&&(*p>='0'&&*p <='9'))// 当为数字且不为\0时候执行
{
j*=0.1f;
dec+=(*p-'0')*j; //通…
[/Quote]




#include <stdio.h>
float decimal(char *q)
{
float dec=0.0f;
float j=1.0f;
char *p = q++; //照理说应该会跳到小数点后第一位
while(*p&&(*p>='0'&&*p <='9'))// 当为数字且不为\0时候执行
{
j*=0.1f;
dec+=(*p-'0')*j; //通过递归得到小数部分
p++;
}

//printf("%f\n",dec);
return dec;

}

float atof(char *str)
{
int c;
int sign;
int number=0;
int j=1;
char *p=str;
//float decimal();
float dec;
while(*p) //截取整数部分
{
c=(int)(unsigned char)*p++;
while(c==' ')
{
++p;
}

sign=c;
if(c=='-'||c=='+')
c = (int)(unsigned char)*p++;
while(c>='0'&&c <='9')
{
number=number*10+(int)(c-'0');
c=(int)(unsigned char)*p++;
}
//p++;
if(c=='.')
break;
p++; //换个位置

}
// printf("%d\n",number);
dec =decimal(p);
if(sign=='-')
return -(number+dec);
else
return (number+dec);
}


int main(void)
{
char *p="-98.345";
printf("%f",atof(p));
return 0;
}


jakky520 2008-09-24
  • 打赏
  • 举报
回复
小弟稍微修改了下 ,还是有点点问题 只能得到小数点后面第二位以后的数字,小数点后第一位的不到 ,修改指针也没有 不知道怎么回事,整数部分没问题
#include <stdio.h>
float decimal(char *q)
{
float dec=0.0f;
float j=1.0f;
char *p = q++; //照理说应该会跳到小数点后第一位
while(*p&&(*p>='0'&&*p<='9'))// 当为数字且不为\0时候执行
{
j*=0.1f;
dec+=(*p-'0')*j; //通过递归得到小数部分
p++;
}

//printf("%f\n",dec);
return dec;

}

float atof(char *str)
{
int c;
int sign;
int number=0;
int j=1;
char *p=str;
//float decimal();
float dec;
while(*p) //截取整数部分
{
c=(int)(unsigned char)*p++;
while(c==' ')
{
++p;
}

sign=c;
if(c=='-'||c=='+')
c = (int)(unsigned char)*p++;
while(c>='0'&&c<='9')
{
number=number*10+(int)(c-'0');
c=(int)(unsigned char)*p++;
}
p++;
if(c=='.')
break;

}
// printf("%d\n",number);
dec =decimal(p if(sign=='-')
return -(number+dec);
else
return (number+dec);
}


int main(void)
{
char *p="-98.345";
printf("%f",atof(p));
return 0;
}


为什么得到不呢?奇怪了 输出结果是-98.450000
hai3qing 2008-09-23
  • 打赏
  • 举报
回复
#include <stdio.h>
float decimal(char *q)
{
float dec=0.0f;
int j=1;
while(*q)
{
q++; ///////?为什么++,应该放在下面?
j*=10;
dec+=(*q-'0')/j; ////////j是int类型的,前面加上(float)
//q++
}

return dec;

}

float atof(char *str)
{
int c;
int sign;
int number=0;
int j=1;
char *p=str;
//float decimal();
float dec;
while(*p) //截取整数部分
{
c=(int)(unsigned char)*p++;
while(c==' ')
{
++p;
}
sign=c;
if(c=='-'||c=='+')
c = (int)(unsigned char)*p++;
while(c>='0'&&c <='9')
{
number=number*10+(int)(c-'0');
c=(int)(unsigned char)*p++;
}
p++; ///////为什么++??
if(c=='.')
break;

}
dec =decimal(p);//截取小数部分 这个地方能得到p指针的地址吗?这个地址能穿到decimal函数去么?如果不能 怎么c传 ?

if(sign=='-')
return -(number+dec);
else
return (number+dec);
}


int main(void)
{
char *p="-98.321";
printf("%f",atof(p));
return 0;
}
jakky520 2008-09-23
  • 打赏
  • 举报
回复
我的问题出在哪 ,我觉得那个函数的调用有问题,整个程序跑出来的情况是只能显示整数和符号部分,
但是小数部分全部为0.


dec =decimal(p); 觉得这个函数的调用没有调用到指针,p 的指向有问题 。


请问下跳出循环后还能得到循环时候的指针地址吗?
  • 打赏
  • 举报
回复
答案出来了……
baihacker 2008-09-23
  • 打赏
  • 举报
回复
读到.的时候置当前读的数据为下一个字符。
double base = 0.1;
double result = 0;
while (当前字符不为NULL&&当前字符为数字)
{
result = result + (当前字符 - '0’) * base;
base *= 0.1;
指向下一个字符
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧