本题要求实现一个函数,将一组数字型字符串,转换成double型的浮点数。
函数接口定义:
函数接口如下:
double myatof(char s[]);
其中s[ ]是输入的数字型字符串,函数返回一个double类型的浮点数。
裁判测试程序样例:
主函数中通过键盘输入一组字符串,调用myatof函数进行转换并打印输出 。
#include “stdio.h”
#define N 20
double myatof(char s[]);
int main()
{
double num;
char s[N];
while(1)
{
scanf("%s",s);
if (s[0]==‘q’) break;
num=myatof(s);
printf("%f\n",num);
}
return 0;
}
/* 请在这里填写答案 */
输入样例:
输入多个数字型的字符串,每个字符串之间换行符隔开。字符串可能包括空格符、正负符号、小数点以及其它非数字字符。 对输入的字符串进行转换时,首先跳过行首的空格字符,直到遇上数字、小数点或正负符号才开始做转换,而再遇到其它非数字字符时或字符串结束时才结束转换,并将结果返回。 当输入字符’q’时,程序结束。 例如:
6.348
-2.98
.525
q
输出样例:
double型浮点数,显示小数点后六位。 当为正数时,浮点数第一位不显示’+’。 当为负数时,浮点数第一位显示’-’. 如:
6.348000
-2.980000
0.525000
程序1(多return):
double myatof(char s[])
{
double small=1,sum=0,falg=1;
int i=0;
//去掉遇到数字前的其他字符
while(!(s[i]>='0'&&s[i]<='9'||s[i]=='+'||s[i]=='-'||s[i]=='.')&&s[i]!='\0'){
i++;
}
if(s[i]=='\0') //无数字字符,返回0;
return 0;
if(s[i]=='-'){ //如果读到负号用falg标记
falg=-1;
i++;
}
if(s[i]=='+'){ //读到正号则跳过
i++;
}
//计算小数点前的数字
while(s[i]>='0'&&s[i]<='9')
{
sum=sum*10+(s[i]-'0');
i++;
}
//计算小数点后数字,并统计位数,用small记录,最后除以small变小数
if(s[i]=='.')
{
i++;
while(s[i]>='0'&&s[i]<='9')
{
sum=sum*10+(s[i]-'0');
i++;
small*=10;
}
}
//计算出sum=0,则直接返回0
if(sum==0)
return 0;
return falg*sum/small;
}
程序1改进:
double myatof(char s[])
{
double small=1,sum=0,falg=1;
int i=0;
//去掉遇到数字前的其他字符
while(!(s[i]>='0'&&s[i]<='9'||s[i]=='+'||s[i]=='-'||s[i]=='.')&&s[i]!='\0'){
i++;
}
//无数字字符,sum为0;
if(s[i]=='\0')
sum=0;
else{
if(s[i]=='-'){ //如果读到负号用falg标记
falg=-1;
i++;
}
if(s[i]=='+'){ //读到正号则跳过
i++;
}
//计算小数点前的数字
while(s[i]>='0'&&s[i]<='9')
{
sum=sum*10+(s[i]-'0');
i++;
}
//计算小数点后数字,并统计位数,用small记录,最后除以small变小数
if(s[i]=='.')
{
i++;
while(s[i]>='0'&&s[i]<='9')
{
sum=sum*10+(s[i]-'0');
i++;
small*=10;
}
}
if(sum==0){ //如果不进行sum=0时直接进行else操作sum也会等于0但无法过测试点无任何有效数字字符时输出0.000000
sum=0;
}
else{
sum=falg*sum/small;
}
}
return sum;
}
最后的if-else也可用以下if代替:
if(sum!=0){
sum=falg*sum/small;
}
程序2:
double myatof(char s[])
{
char *p=s;
double small=1,sum=0,falg=1;
while(!(*p>='0'&&*p<='9'||*p=='+'||*p=='-'||*p=='.')&&*p!='\0'){
p++;
}
if(*p=='\0')
sum=0;
else{
if(*p=='-'){
falg=-1;
p++;
}
if(*p=='+'){
p++;
}
while(*p>='0'&&*p<='9')
{
sum=sum*10+(*p-'0');
p++;
}
if(*p=='.')
{
p++;
while(*p>='0'&&*p<='9')
{
sum=sum*10+(*p-'0');
p++;
small*=10;
}
}
if(sum!=0){
sum=falg*sum/small;
}
}
return sum;
}