1

我被分配创建一个扫描浮点数的过程,称为 getfloat。

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

示例 - 输入:-1。输出:499.00000 这是我的代码:

#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;
}
4

3 回答 3

1

49 是数字 1 的Ascii代码。因此,当(0'<=c && c <='9')您需要减去'0'以获取数字本身时。

于 2013-06-11T18:22:14.007 回答
1

有很多问题。

1)您发布的代码与您的示例“输入:-1。输出:499.00000”不匹配,由于在找到'-'. 见#6。

1) 'c' 是一个字符。当您输入时'1', c 采用字母的代码1,在您的情况下是 ASCII 编码,是 49。要将数字从其 ASCII 值转换为数字值,请减去 48(字母的 ASCII 代码'0',通常作为c - '0'

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

变成

*num = (*num*10) + (c-'0');
*num += (c-'0')/exponent;

2)虽然您声明cfloat,但建议您将其声明为intint是 的返回类型getch()

3)函数getch()是“用于从控制台获取字符但不回显到屏幕”。这就是为什么你看不到他们。getchar()改为考虑。

4)[编辑:删除避免=-。谢谢@Daniel Fischer]

5) 你的指数计算需要返工。注意:您的指数可能会收到一个符号字符。

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

祝你C旅途愉快。

于 2013-06-12T04:12:48.247 回答
0

一个小提示:49 是ASCII1。character您正在使用 getch(),它会为您提供返回值char

于 2013-06-11T18:21:36.310 回答