Math 扫描浮点,得到看似随机的值

Math 扫描浮点,得到看似随机的值,math,floating-point,getch,Math,Floating Point,Getch,我被指派创建一个扫描浮点的过程,称为getfloat 出于某种原因,我得到的是随机值。如果我输入“1”,它将打印49。为什么会发生这种情况?而且,当我输入值时,我在屏幕上看不到它们?例如,当我使用scanf时,我会在小黑屏上看到我点击的内容。但现在屏幕是空白的,当我单击enter时,它会显示一个错误的输出: 示例-输入:-1。产量:4990万 这是我的密码: #include <stdio.h> #include <conio.h> #include <math.h

我被指派创建一个扫描浮点的过程,称为getfloat

出于某种原因,我得到的是随机值。如果我输入“1”,它将打印49。为什么会发生这种情况?而且,当我输入值时,我在屏幕上看不到它们?例如,当我使用scanf时,我会在小黑屏上看到我点击的内容。但现在屏幕是空白的,当我单击enter时,它会显示一个错误的输出:

示例-输入:-1。产量:4990万 这是我的密码:

#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <ctype.h>
void getfloat(float* num);
void main()
{
    float num=0;
    printf("Enter the float\n");
    getfloat(&num);
    printf("\nThe number is %lf\n",num);
    getch();
}
void getfloat(float* num)
{
    float c,sign=1,exponent=10;
    c=getch();
    if((!isdigit(c))&&(c!='+')&&(c!='-')) //if it doesnt start with a number a + or a -, its not a valid input
    {
        printf("Not a number\n");
        return;
    }
    if(c=='-') //if it starts with a minus, make sign negative one, later multiply our number by sign
        sign=-1;
    for(*num=0;isdigit(c);c=getch())
        *num=(*num*10)+c; //scan the whole part of the number
    if(c!='.') //if after scanning whole part, c isnt a dot, we finished
        return;
    do //if it is a dot, scan fraction part
    {
        c=getch();
        if(isdigit(c)) 
        {
            *num+=c/exponent;
            exponent*=10;
        }
    }while(isdigit(c));
    *num*=sign;
}
#包括
#包括
#包括
#包括
void getfloat(float*num);
void main()
{
float num=0;
printf(“输入浮点值”);
getfloat(&num);
printf(“\n编号为%lf\n”,num);
getch();
}
void getfloat(float*num)
{
浮点数c,符号=1,指数=10;
c=getch();
如果(!isdigit(c))&&&&(c!='+')&&&(c!='-')//如果它不是以数字a+或a-开头,则它不是有效的输入
{
printf(“不是数字”);
返回;
}
if(c=='-')//如果它以负号开头,则将符号设为负号,然后将数字乘以负号
符号=-1;
对于(*num=0;isdigit(c);c=getch())
*num=(*num*10)+c;//扫描数字的整个部分
if(c!='.')//如果扫描整个零件后,c不是点,我们就完成了
返回;
如果是点,则扫描分数部分
{
c=getch();
if(isdigit(c))
{
*num+=c/指数;
指数*=10;
}
}while(isdigit(c));
*num*=符号;
}

一个小提示:49是
字符的
ASCII
。您使用的是getch(),它提供返回值
char

49是数字1的代码。因此,当
(0'时,存在许多问题

1) 您发布的代码与示例“input:-1.Output:499.00000”不匹配,因为在找到
'-'
后缺少getch(),所以我得到0。见第6页

1) “c”是一个字符。当您输入
'1'
时,c接受字母
1
的代码,在您的例子中,它是ASCII编码,是49。要将数字从ASCII值转换为数字值,请减去48(字母
'0'
的ASCII码,通常作为
c-'0'

*num=(*num*10)+c;
*num+=c/exponent;
变成

*num = (*num*10) + (c-'0');
*num += (c-'0')/exponent;
2) 尽管您将
c
声明为
float
,但建议您将其声明为
int
int
getch()
中的返回类型

3) 函数
getch()
用于“从控制台获取字符,但不会回显到屏幕”。这就是为什么你看不到他们。考虑<代码> GETCHARE()< <代码> > .< /P> 4) [编辑:删除避免
=-
。谢谢@Daniel Fischer]

5) 你的指数计算需要重做。注意:您的指数可以接收符号字符

6) 当您测试
if(c=='-')
时,您不会再获取另一个
c
。您可能还需要测试
的else if(c=='+')
并使用该
c


祝你在
C
旅程中好运。

复合赋值运算符的
=-
等形式早在第一个标准被批准之前就已经被废除了<代码>符号=-1
是一个明确的
符号=-1(可读性较差)。学究式的注释:“c代表字母的ASCII码”不一定是真的,它也可能是EBCDIC(或者一种不同的编码,但ASCII兼容和EBCDIC是我所知道的唯一可以使用的)。@Daniel Fischer我很少看到非间隔的
=-
,所以我和你一样,相信它已经过时了。我对代码的测试似乎是为了执行
-=
功能。我可以稍后再复习。关于“c接受ASCII…不一定是真的”一般来说是真的,但OP的“如果我输入“1”,它将打印49”肯定指向ASCII。顺便说一句,在ASCII或EBCDIC中,(c-'0')会将
c
转换为其数值。当我在
符号=-1之后打印出
符号时,我对代码的调试出现错误
(我假设它是
int
类型而不是
float
。看到
0
,然后假设它是古老的(尽管现在已经过时了)
C
语法。
C-'0'
适用于十进制数字是标准所要求的(遗憾的是,它不适用于十六进制数字,如果
'A'=='0'+10
等,这将非常方便。)是的,这是一个相当安全的赌注,OP使用ASCII兼容编码,这只是一个迂腐的注释;)