我是C的初学者。我正在尝试编写一个程序,根据用户使用fgets()
的3个整数输入来计算音量,我很难理解为什么我的代码不能正常工作
#include <stdio.h>
#include <stdlib.h>
int volumn(int a, int b, int c);
int main(int argc, char* argv[]){
char* height, width, depth;
fgets(&height, 10, stdin);
fgets(&width, 10, stdin);
fgets(&depth, 10, stdin);
printf("\nThe volumn is %d\n", volumn(atoi(&height), atoi(&width), atoi(&depth)));
return 0;
}
int volumn(int a, int b, int c){
return a * b * c;
}
编辑:运行上述代码后,我收到以下错误/警告:
goodbyeworld.c:8:11: warning: incompatible pointer types passing 'char **' to
parameter of type 'char *'; remove & [-Wincompatible-pointer-types]
fgets(&height, 10, stdin);
^~~~~~~
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/stdio.h:238:30: note:
passing argument to parameter here
char *fgets(char * __restrict, int, FILE *);
^
goodbyeworld.c:12:48: warning: incompatible pointer types passing 'char **' to
parameter of type 'const char *'; remove & [-Wincompatible-pointer-types]
printf("\nThe volumn is %d\n", volumn(atoi(&height), atoi(&width), a...
^~~~~~~
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/stdlib.h:132:23: note:
passing argument to parameter here
int atoi(const char *);
^
2 warnings generated.
答案 0 :(得分:2)
首先,像
这样的定义 char* height, width, depth;
将height
指向char
,将其余两个指向char
。
其次(不太相关 here ,但一般来说很重要),你没有为你想要使用的指针分配内存(如果有的话)。
如果你有一个固定的输入长度决定为10
,你可以简单地将所有三个变量作为数组,直接使用名称,如
#define VAL 10
char height[VAL] = {0};
char width[VAL] = {0};
char depth[VAL] = {0};
然后
fgets(height, 10, stdin);
最后,考虑使用strtol()
而不是atoi()
来更好地处理错误。
答案 1 :(得分:0)
你不应该。当您可以将输入作为整数时,使用atoi
将输入转换为整数是没有意义的。您要找的是scanf
。
您的代码看起来像这样......
#include <stdio.h>
#include <stdlib.h>
int volumn (int a, int b, int c);
int
main (int argc, char* argv[])
{
int height;
int width;
int depth;
scanf ("%10d", &height);
scanf ("%10d", &width);
scanf ("%10d", &depth);
printf ("\nThe volumn is %d\n", volumn (height, width, depth));
return 0;
}
int
volumn (int a, int b, int c)
{
return a * b * c;
}
答案 2 :(得分:0)
在C中,数组名称降级为指向数组第一个地址的指针
但是,尺寸已经是(仅)指向什么的指针。
代码需要实际让它们指向已分配的内存。
通常,这将通过类似于以下的代码来完成:
if( NULL == (height = malloc( 20 ) ) ) { // handle error and exit }
我使用的是20而不是10,因为int可以是13个字符加上符号加上换行符加上NUL字节,20个留下一些额外的空间。
fgets()的第一个参数是指向输入缓冲区的指针,&#39; height&#39;等被定义为指针,因此不需要另一个&#39;&amp;&#39;
但是,使用malloc()还需要在退出程序之前将三个指针中的每一个传递给free()。
记住int(在32位系统上)可以处理+/- 2gig I.E. 10位+符号+换行符+ NUL是(取决于操作系统)13或14个字符。
建议,使用:
int main( void )
{
int height;
int width;
int depth;
if( 1 != (scanf( "%d", &height ) ) )
{ // then scanf failed
perror( "scanf for height failed: );
exit( EXIT_FAILURE );
}
// implied else, scanf successful
similar statements for the other two inputs
printf ("\nThe volumn is %d\n", volumn (height, width, depth));
return 0;
} // end function: main
答案 3 :(得分:0)
简单解决您的问题。
#include <stdio.h>
#include <stdlib.h>
int volumn(int a, int b, int c){
return a*b*c;
}
int main(){
char height[10];
char width[10];
char depth[10];
printf("Please enter size of object:\n");
fgets(height, 10, stdin);
fgets(width, 10, stdin);
fgets(depth, 10, stdin);
int valheight = atoi(height);
int valwidth = atoi(width);
int valdepth = atoi(depth);
printf("\nThe volumn is %i\n", volumn(valheight, valwidth, valdepth));
return 0;
}