使用指针

时间:2017-10-12 19:50:10

标签: c scanf pass-by-reference

我正在编写一个简单的程序来计算圆柱体的表面积和体积。我没有在main()中编写所有代码,而是使用了3个函数。

第一个函数读取高度和半径的输入数据,将值传递回主程序。

第二个函数使用参数height和radius来计算面积和体积的值,将每个参数传递回主程序。

第三个函数在print语句中使用参数area和volume。

#include<stdio.h>
#define PI 3.14159 

static void inputData(double *ph, double *pr);
static void computeResults(double h, double r, double *pa, double *pv);
static void displayAnswer(double a, double v);

main()
{
    double h,r,a,v;

    inputData(&h, &r);
    computeResults(h, r, &a, &v);
    displayAnswer(a, v);

    return;
}

static void inputData(double *ph, double *pr)
{
    printf("Height: ");
    scanf("%g", ph);
    printf("Radius: ");
    scanf("%g", pr); 
}

static void computeResults(double h, double r, double *pa, double *pv)
{
    *pa = (2 * PI * h * r);
    *pv = (PI * h * r * r);
}

static void displayAnswer(double a, double v)
{
    printf("The Area is: %f", a);   
    printf("The Volume is: %f", v);
}

我在inputData函数中遇到scanf行的问题。

错误讯息:

surfaceAreaCylinder.c:22:8:警告:格式'%g'需要类型为'float *'的参数,但参数2的类型为'double *'[-Wformat =]   scanf(“%g”,ph);         ^

surfaceAreaCylinder.c:24:8:警告:格式'%g'需要类型为'float *'的参数,但参数2的类型为'double *'[-Wformat =]   scanf(“%g”,pr);

我对指针有基本的了解,并且知道scanf必须将信息返回给调用者,因此控制字符串后面的参数必须使用引用调用。请帮我理解!

2 个答案:

答案 0 :(得分:4)

"%g"适用于数据类型float,但您提供类型为double的参数。请改用"%lg"。有关详细信息,请参阅cppreference.com上的scanf参考。

答案 1 :(得分:1)

scanf函数的inputData(double*, double*)行中,您已将格式字符串指定为"%g"。此格式字符串用于单精度浮点数,这意味着您对scanf的调用需要指向float的指针作为第二个参数。

您有两个选择。

  1. 在调用"%lf"scanf
  2. 时,将scanf("%lf", ph);用作格式字符串。
  3. double更改为float

维基百科对可用格式字符串有相当不错的细分: https://en.wikipedia.org/wiki/Scanf_format_string#Format_string_specifications