大家帮帮忙,还是不明白
稍稍改了一下:发现输入分数时函数bd的返回值不是0,而是根据分子来决定返回值。而单独使用bd函数却没有这个问题,请问这是什么原因啊?
bd这个函数的返回值好像经过bd函数被另一个函数调用后,返回值发生了变化,这是怎么回事啊,什么地方出错了?
#include<stdio.h>
#include<conio.h>
#include<string.h>
int bd(char *num); /* 判断字符串是什么类型,整数型返回1,小属型返回2,分数型返回0,错误型返回4,负整数返回-1,负小数返回-2 */
double strtod(char *num); /* 将字符串转化成浮点数 */
double dten (int a);
void main ()
{
char num[20];
double x;
while(1)
{
printf("\n输入数字:");
gets(num);
x=strtod(num);
printf("\n%d\n%f",bd(num),x);
}
}
int bd (char *num)
{
int i,len;
int x,d,s,o,f; /* x为斜杠个数,d为逗点个数,s数字个数,o其他字符个数,f负号个数 */
char *p1,*p2;
x=0;
d=0;
s=0;
o=0;
f=0;
len=strlen(num);
/* 统计各个符号的个数 */
for (i=0;i<len;i++)
{
if (*(num+i)=='/')
{
x++;
}
else if (*(num+i)=='.')
{
d++;
}
else if (*(num+i)>='0'&&*(num+i)<='9')
{
s++;
}
else if (*(num+i)=='-')
{
f++;
}
else
{
o++;
}
}
/* 判断是什么数字类型 */
/* 非分数型 */
if (o==0&&x==0)
{
/* 正数型 */
if (f==0)
{
/* 正整数型 */
if(d==0)
{
return 1;
}
/* 正小数型 */
else if (d==1)
{
if (*(num)!='.'&&*(num+len-1)!='.')
{
return 2;
}
else
{
return 4;
}
}
/* 错误型 */
else
{
return 4;
}
}
/* 负数型 */
else if (f==1)
{
/* 负整数 */
if (d==0)
{
if (*(num)=='-')
{
return -1;
}
else
{
return 4;
}
}
/* 负小数 */
else if (d==1)
{
if (*(num)=='-')
{
if (*(num+1)!='.'&&*(num+len-1)!='.')
{
return -2;
}
else
{
return 4;
}
}
else
{
return 4;
}
}
else
{
return 4;
}
}
else
{
return 4;
}
}
/* 分数型 */
else if (o==0&&x==1)
{
if (*(num)!='/'&&*(num+len-1)!='/')
{
p1=strtok(num,"/");
p2=strtok(NULL,"\0");
if (bd(p1)==4||bd(p2)==4)
{
return 4;
}
else
{
return 0;
}
}
else
{
return 4;
}
}
/* 错误型 */
else
{
return 4;
}
}
double strtod(char *num)
{
int i,j,k,len;
double x=0,y=0;
char *p1,*p2;
if (bd(num)==1) /* 整数型 */
{
len=strlen(num);
for (i=0;i<len;i++)
{
x=x+((*(num+len-1-i))-48)*dten(i);
}
}
else if (bd(num)==2) /* 小数型 */
{
len=strlen(num);
for (i=0;*(num+i)!='.';i++)
{
}
k=i;
for (i=0;*(num+i)!='.';i++)
{
x=x+(double)((*(num+k-1-i))-48)*dten(i);
}
for (k=1,j=i+1;j<len;k++,j++)
{
x=x+(double)((*(num+j))-48)/dten(k);
}
}
else if (bd(num)==-1||bd(num)==-2) /* 负整数,负小数 */
{
p1=strtok(num,"-");
x=-strtod(p1);
}
else if (bd(num)==0) /* 分数 */
{
p1=strtok(num,"/");
p2=strtok(NULL,"\0");
x=strtod(p1);
y=strtod(p2);
x=x/y;
}
return x;
}
double dten (int a)
{
long int b=1,i;
for(i=0;i<a;i++)
{
b=b*10;
}
return (double)(b);
}
[[it] 本帖最后由 zqmillet 于 2008-8-9 18:08 编辑 [/it]]