atof函数的实现

atof函数的实现

题目描述:

输入一组数字型字符串,将其转换成double型的浮点数。

要求:不能使用系统函数atof,需要自己定义实现该函数。

输入格式:

输入多个数字型的字符串,每个字符串之间换行符隔开。字符串可能包括空格符、正负符号、小数点以及其它非数字字符。
对输入的字符串进行转换时,首先跳过行首的空格字符,直到遇上数字、小数点或正负符号才开始做转换,而再遇到其它非数字字符时或字符串结束时才结束转换,并将结果返回。
当输入字符’q’时,程序结束。

输出格式:

double型浮点数,显示小数点后六位。
当为正数时,浮点数第一位不显示’+‘。
当为负数时,浮点数第一位显示’-'.

输入样例:

在这里给出一组输入。例如:

6.348
-2.98
.525
q

输出样例:

在这里给出相应的输出。例如:

6.348000
-2.980000
0.525000

思路:

这道题不允许使用系统函数atof,则我们可以自己定义一个函数myatof。这个函数的实现的思路是将小数的首尾空格都去掉,再判断这个小数是正数还是负数,将小数点的前面和后面的数转换成整数,这样转换后的数就是不带小数点的数了,如6.348转化后为6348,在转化小数点后面的数时,将一个变量ans不断乘10,这样转换完后ans就是1000。最后将结果除以ans就是6,348了,最后按照是正数还是负数输出。注意再输入的时候,如果使用gets来输入字符串,在处理的时候要去除字符串前面的空格,因为gets输入会把空格一起输入数组。而如果用scanf输入的时候就不需要去除字符串前面的空格,因为scanf并不会把字符串前面的空格输入进数组。

代码:

#include<stdio.h>
char x[20];  //存放数字型字符串 

double myatof()
{
	int flag=1,i=0;
	int ans=1;
	double sum=0;
	while(!(x[i]>='0'&&x[i]<='9'||x[i]=='+'||x[i]=='-'||x[i]=='.')&&x[i]!='\0')
		i++;   //去除字符串前面的空格,如果使用scanf输入则不需要这一步 
	if(x[i]=='\0')  //如果是空数组,返回 0 
		return 0;
	if(x[i]=='-')
	{   //如果有负号,则标记上 
		flag=-1;
		i++; 
	}	
	if(x[i]=='+')
		i++;  
	while(x[i]>='0'&&x[i]<='9')
	{   //将小数点前的数变成整数 
		sum=sum*10+(x[i]-'0');
		i++;
	}
	if(x[i]=='.')
	{
		i++;
		while(x[i]>='0'&&x[i]<='9')
		{   //将小数点后的数变成整数 
			sum=sum*10+(x[i]-'0');
			i++;
			ans*=10; //每次成10,最后用于除总和,变成小数 
		}
	}
	if(sum==0)
		return 0;
	return flag*sum/ans;
}

int main()
{
	double num;
	while(1)
	{
		gets(x);  //用gets输入会输入字符串首的空格,scanf则不会 
		if(x[0]=='q') 
			break;
		num=myatof();  //调用自定义的atof函数 
		printf("%lf\n",num);
	}
	return 0;
}

拓展(使用系统函数)

#include<stdio.h>
#include<stdlib.h>  //atof函数的头文件 
int main()
{
	char x[20];
	double sum;
	while(1)
	{
		scanf("%s",x);
		if(x[0]=='q')
			break;
		sum=atof(x);
		printf("%lf\n",sum);	
	}	
	return 0;
}
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值