【问题标题】:Need help displaying float into printf [duplicate]需要帮助将浮点数显示到 printf [重复]
【发布时间】:2018-10-23 18:58:07
【问题描述】:

我在浮点数上测试编码并以单个函数在打印中显示它们,在让它工作后,我将它更改为模块化但我输入的浮点数之一不显示(例如输入是 2.4,显示 4部分,但不是 2)。

这是我正在做的事情的代码

#include <stdio.h>


int calculate (float change, int dollar, int cents)
{
    scanf ("%f", &change);

    dollar = (int) change;
    cents = (int) (((change - dollar) * 100) + 0.5);

    return (dollar, cents);
}

int display (int dollar, int cents)
{
    printf("dollar is %d\n", dollar);
    printf("cents is %d", cents);

    return (0);
}

int main ()
{
    float change;
    int dollar, cents;

    dollar = (int) change;
    cents = calculate(change, dollar, cents);

    display (dollar, cents);

    return (0);
}

** 它没有在 printf 中显示美元,我得到的只是 0 **

【问题讨论】:

  • return (dollar, cents); 并没有按照你的想法做 - 你只能 return 来自函数的单个值,你需要使用指针作为“输出参数”
  • @UnholySheep 对,我不知道。或者我一定错过了这些信息。谢谢!
  • 编译所有警告和调试信息,所以gcc -Wall -Wextra -gGCC。改进您的代码以获得没有警告。然后use the gdb debugger 了解您的程序的行为。改进它。重复直到满意。关于浮动,请阅读floating-point-gui.de

标签: c


【解决方案1】:

注意return (dollar, cents); 正在使用comma operator(因此返回cents)。

如果您希望 calculate 返回 两个 值,您应该声明 struct 类似

struct monetarytwoints_st {
  int mon_dollars;
  int mon_cents;
};

并让calculate 返回该类型,因此编写类似

的代码
struct monetarytwoints_st calculate(float change) {
   int doll, cnts;
   doll = (int) change;
   cnts = (int) (((change - doll) * 100) + 0.5);
   return (struct monetarytwoints_st) { doll, cnts };
}

您可能应该在一个函数中输入,而在另一个函数中进行计算。从calculate 调用scanf 是非常糟糕的品味。

顺便说一句,返回一个小的 struct 两个数字在 x86-64 上非常有效; x86-64 ABI 表示使用两个寄存器来返回这么小的struct

请注意,C 使用call-by-value 参数传递,因此被调用函数中某些形式参数的任何更改都不会影响调用语句中调用站点的实际参数。

【讨论】:

  • 我不认为我们在学校不学习结构,它在课程中所以我不明白,但是谢谢!
【解决方案2】:

您可以使用指针来获取变量的值。

cents = calculate(change, &dollar, &cents);

这里美元和美分与地址一起传递,以便在主函数中访问该值。

int calculate (float change, int* dollar, int* cents)
{
    scanf ("%f", &change);

    *dollar = (int) change;
    *cents = (int) (((change - *dollar) * 100) + 0.5);

    return (*dollar, *cents);
}

【讨论】:

  • 不确定是否让函数返回任何内容,共享代码库中的代码会非常混乱。
  • @arun 我设法通过使用您的示例使其工作,所以它有很多帮助。我对 c 编程还是新手,有时无法绕过它(比如按值传递?还是引用?通过这样做int calculate (float change, int* dollar, int cents) { scanf ("%f", &amp;change); *dollar = (int) change; cents = (int) (((change - *dollar) * 100) + 0.5); 和我的主要int main () { float change; int dollar, cents; dollar = (int) change; cents = calculate(change, &amp;dollar, cents); display (dollar, cents); return (0); }
  • 抱歉看起来很乱,我不知道如何整齐地打印我的代码,哈哈。
  • 我给出的例子是引用调用。我正在传递美元和美分的地址(参考)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
  • 2020-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多