如何在结构中打印变量?

时间:2017-02-02 04:34:36

标签: c struct printf

#include <stdio.h>
#include <math.h>
#define G 9.81

typedef struct
{
    double weight;
    double drag;
    double time;
} USER_INPUT;

double calculateVelocity(USER_INPUT);

int main(int argc, char **argv)
{
    USER_INPUT userInput;
    double velocity;

    printf("Please enter weight, drag and time: ");
    scanf("%lf %lf %lf", &userInput.weight, &userInput.drag, &userInput.time);

    velocity = calculateVelocity(userInput);

    printf("At t = %f , the parachutist with weight %d kg\nand a drag coefficient %8.2f kg/s \n will have a velocity of %8.2f m/s^2", &userInput.time, &userInput.weight, &userInput.drag, velocity);

    return 0;
}

double calculateVelocity(USER_INPUT data)
{
    double velocity;
    // TODO compute velocity
    return velocity;
}

在main函数中,我想显示结果。 如何打印结构中定义的变量? 我尝试%f,返回0.000000,%d返回一个随机数。

4 个答案:

答案 0 :(得分:0)

我不确定所有的物理或哪个等式,所以我有点伪造,但我得到你的程序编译和运行所以你应该很容易从这里修复它。随意询问有关指针内容的问题,以及为什么地址在不同的地方都没有使用过。

#include <stdio.h>
#include <math.h>

#define G 9.81
#define P 1.00 // ?
#define A 1.00 // ?

typedef struct {
    double weight;
    double drag;
    double time;
} userInput_t;

double calculateVelocity(userInput_t *); // Terminal velocity?

double calculateVelocity(userInput_t *data) {
   return sqrt((2 * data->weight * G)/(P * A * data->drag));
}

int main(void) {

    userInput_t userInput;

    printf("Please enter weight, drag and time: ");
    scanf("%lf %lf %lf", &userInput.weight, &userInput.drag, &userInput.time);


    double velocity = calculateVelocity(&userInput);

    printf("\nAt t = %f, the parachutist with weight %f kg\n"
           "and a drag coefficient %f kg/s\n"
           "will have a velocity of %f m/s^2\n", 
              userInput.time, userInput.weight, userInput.drag, velocity);
}

答案 1 :(得分:0)

int printf(const char *format, ...); int scanf(const char *format, ...);

scanf使用变量的内存地址,而printf则使用变量本身。

这是UB试图 printf ("%d", memory_addres_of_variable);

因为打印内存地址的正确方法是使用%zu从C99及更高版本开始,而%lu使用ANSI C 90。

这就是你看到随机数的原因。

答案 2 :(得分:0)

该问题与struct无关。您将地址变量而不是传递给printf。所以解决方案很简单:在&调用中删除变量名前的printf

这是一个常见的错误:scanf需要变量的地址才能改变它们的值,而printf只需要取值。不幸的是,即使原型也没有明显:

int printf(const char *format, ...);
int scanf(const char *format, ...);

您需要将%f用于double个变量(源自 f loat的类型),%d用于int (的 d ecimal)。

结果:

printf("At t = %f , the parachutist with weight %f kg\nand a drag coefficient %8.2f kg/s \n will have a velocity of %8.2f m/s^2", userInput.time, userInput.weight, userInput.drag, velocity);

参考文献:

答案 3 :(得分:0)

打印时出错,

请注意&#39;&amp;&#39;用于获取任何变量的地址,而不是值。因此,当您打印时:

printf("At t = %f , the parachutist with weight %d kg\nand a drag coefficient %8.2f kg/s \n will have a velocity of %8.2f m/s^2", &userInput.time, &userInput.weight, &userInput.drag, velocity);

您实际上正在打印变量的加法器:

&amp; userInput.time((userInput.time)的地址), &amp; userInput.weight((userInput.weight)的地址)和&amp; userInput.drag((userInput.drag)的地址)。

你想要打印他们的价值,而不是地址,因此删除&#39;&amp;&#39;打印时:

即;

printf("At t = %f , the parachutist with weight %d kg\nand a drag coefficient %8.2f kg/s \n will have a velocity of %8.2f m/s^2", userInput.time, userInput.weight, userInput.drag, velocity);