【问题标题】:Why does my program return a memory address?为什么我的程序返回一个内存地址?
【发布时间】:2019-04-07 01:47:17
【问题描述】:

我编写了一个名为 averageFloat 的程序,它应该接受一个数字的扫描输入。这允许用户输入许多浮点输入,然后该函数取这些输入的平均值。

但是,当我编译并运行程序时,它确实接受了我的输入,但它返回了 -1610612736。

我已经尝试过更改 scanf 的存储,我添加了一个指针并包含了 scanf 将在 main 函数和 averageFloat 函数中调用的全局变量。

#include <stdio.h>

float averageFloat(int a);

int y;
float z; 

int main()
{
    int n;
    printf("Please input a number of floats you want to include "); 
    n = scanf("%d", &y); 
    averageFloat(n);

    return 0;
}

float averageFloat(int a){

    for(int i = 0; i < a; i++){
        printf("Please enter the float variables you want your program to average");
        scanf("%f", &z); 
        z += z;
    }
    printf("the average float is %d", z/a);
    return z / a; 
}

我希望这会接受我的输入 n,假设 n = 5。

我希望能够输入 5 个浮点数,比如 0.5、0.2、0.3、0.1 和 1.5,然后除以 n

感谢您的阅读。

【问题讨论】:

    标签: c


    【解决方案1】:

    您的代码中有几个问题:

    • 使用scanf 写入z 变量,这也是您的 求和变量。每次读取输入时,您基本上都会覆盖总数

    • 将十进制数扫描到浮点变量中会产生意想不到的结果。需要把scanf("%d",&amp;z);改成scanf("%f",&amp;z);

    • printf 语句需要一个整数,而您正在传递一个指向浮点数的指针。所以需要把printf("the average float is %d", z/a);改成printf("the average float is %f", z/a);

    • 变量y需要传递给averageFloat函数,而不是前一行scanf函数的返回值。

    【讨论】:

    • (威震天的声音)耶斯。 . .我懂了。现在很清楚了。
    • 我注意到另一个问题,当我添加 2 个输入,然后输入 2.5 和 3.5 时它返回 2.5,而它应该返回 3.0,这是为什么?
    • 仔细检查后,您还使用 scanf 语句的返回值作为要平均的元素数:n = scanf("%d", &amp;y);averageFloat(n);。变量 y 应该用于调用 averageFloat
    • 但是这里的 y 和 n 不应该基本相同,还是我遗漏了什么? (我肯定遗漏了一些东西,因为我按照你说的做了,而且效果很好。)
    • 所以这就是它一直返回 2.5 的原因,这就是我必须使用 y 的原因,因为它在分配时返回的值只是项目的数量。我会继续阅读,我的书还不够深入,但稍后会有一节介绍 scanf 的限制。
    【解决方案2】:

    当您执行scanf("%f", &amp;z); 时,您正在破坏z 拥有的任何价值。您也没有检查scanf 是否成功。

    你应该这样做:

    float zz= 0.0;
    scanf("%f", &zz); 
    z += zz;
    

    另外,完成后,您可以:

    printf("the average float is %d", (int) z/a);
    return z / a;
    

    或者:

    printf("the average float is %f", z/a);
    return z / a; 
    

    第一个截断为int (%d),第二个打印float

    您还应该检查a 不为零。

    您还应该使用:

    averageFloat(y);
    

    【讨论】:

    • (int)(z/a) 会更好,因为它保留了更多信息。
    • 这行得通,我选择了底部方法。谢谢! :) 但我不清楚发生了什么。我所做的只是声明一个全局 zz,并在 averageFloat 中放入一个局部变量 z。为什么这能解决所有问题?
    • 三件事:首先,你用scanf 覆盖z,所以声明一个变量只是为了输入数字是正确的方法(zz)。其次,你告诉它你要打印一个整数 (%d),但你给了它一个浮点数(包含浮点数的除法的结果;在任何现代编译器上都应该有一个警告) .第三,n= scanf("%d", &amp;y); 的意思是:把读到的数字输入y 并在n 上给我成功指示,所以如果你输入3,y 将有3,n 将有1.
    • @paxdiablo No. (int)(z/a) 截断小数部分。
    • Mirko,我的意图是尽可能推迟截断,因为 (int) z / a 截断 z then 进行整数除法,而 (int)(z/a) 将除法作为浮点数并且只在之后截断浮点值。然而,在测试它时,我想不出一个有区别的例子,因为截断舍入为零。我怀疑四舍五入将是另一回事。
    【解决方案3】:

    首先,变量不应该是全局的。其次,你添加到 z 然后你阅读它。 你可能是想调用函数 averageFloat(y)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 2017-03-18
      • 2014-01-17
      • 1970-01-01
      • 2022-01-13
      相关资源
      最近更新 更多