我正在编写一个简单的程序来计算圆柱体的表面积和体积。我没有在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必须将信息返回给调用者,因此控制字符串后面的参数必须使用引用调用。请帮我理解!
答案 0 :(得分:4)
"%g"
适用于数据类型float
,但您提供类型为double
的参数。请改用"%lg"
。有关详细信息,请参阅cppreference.com上的scanf参考。
答案 1 :(得分:1)
在scanf
函数的inputData(double*, double*)
行中,您已将格式字符串指定为"%g"
。此格式字符串用于单精度浮点数,这意味着您对scanf
的调用需要指向float
的指针作为第二个参数。
您有两个选择。
"%lf"
即scanf
scanf("%lf", ph);
用作格式字符串。
double
更改为float
维基百科对可用格式字符串有相当不错的细分: https://en.wikipedia.org/wiki/Scanf_format_string#Format_string_specifications