如何在 C 中使用 fgets 从用户那里获取整数?
How to take ints from user using fgets in C?
我是 C 语言的初学者。我正在尝试编写一个程序,根据用户输入的 3 个整数使用 fgets()
来计算音量,我很难理解为什么我的代码是不工作。
#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;
}
编辑:当我运行上面的代码时,我得到以下errors/warnings:
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.
首先定义如下
char* height, width, depth;
使 height
成为指向 char
的指针,其余两个作为 char
s.
其次(这里没有太大关系,但总的来说很重要),你没有为你想使用的指针分配内存(如果有的话)。
如果你有一个固定的输入长度决定为10
,你可以简单地将所有三个变量作为数组并直接使用names,比如
#define VAL 10
char height[VAL] = {0};
char width[VAL] = {0};
char depth[VAL] = {0};
然后
fgets(height, 10, stdin);
最后,考虑使用 strtol()
而不是 atoi()
以获得更好的错误处理。
你不应该。当您可以获得输入 作为 整数时,使用 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;
}
在 C 中,数组名退化为指向数组首地址的指针,
但是,维度已经(只是)指向任何内容的指针。
代码实际上需要让它们指向分配的内存。
通常,这将通过类似于以下的代码来完成:
if( NULL == (height = malloc( 20 ) ) ) { // handle error and exit }
我使用 20 而不是 10,因为 int 可以是 13 个字符加上符号加上换行符加上 NUL 字节,而 20 留下了一些额外的空间。
fgets() 的第一个参数是指向输入缓冲区的指针,'height' 等被定义为指针,因此不需要另一个 '&'
但是,使用 malloc() 还增加了在退出程序之前将三个指针中的每一个传递给 free() 的要求。
记住 int(在 32 位系统上)可以处理 +/-2gig I.E. 10位数字+符号+换行符+NUL是一个(取决于OS)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
您的问题的简单解决方案。
#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;
}
我是 C 语言的初学者。我正在尝试编写一个程序,根据用户输入的 3 个整数使用 fgets()
来计算音量,我很难理解为什么我的代码是不工作。
#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;
}
编辑:当我运行上面的代码时,我得到以下errors/warnings:
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.
首先定义如下
char* height, width, depth;
使 height
成为指向 char
的指针,其余两个作为 char
s.
其次(这里没有太大关系,但总的来说很重要),你没有为你想使用的指针分配内存(如果有的话)。
如果你有一个固定的输入长度决定为10
,你可以简单地将所有三个变量作为数组并直接使用names,比如
#define VAL 10
char height[VAL] = {0};
char width[VAL] = {0};
char depth[VAL] = {0};
然后
fgets(height, 10, stdin);
最后,考虑使用 strtol()
而不是 atoi()
以获得更好的错误处理。
你不应该。当您可以获得输入 作为 整数时,使用 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;
}
在 C 中,数组名退化为指向数组首地址的指针,
但是,维度已经(只是)指向任何内容的指针。
代码实际上需要让它们指向分配的内存。
通常,这将通过类似于以下的代码来完成:
if( NULL == (height = malloc( 20 ) ) ) { // handle error and exit }
我使用 20 而不是 10,因为 int 可以是 13 个字符加上符号加上换行符加上 NUL 字节,而 20 留下了一些额外的空间。
fgets() 的第一个参数是指向输入缓冲区的指针,'height' 等被定义为指针,因此不需要另一个 '&'
但是,使用 malloc() 还增加了在退出程序之前将三个指针中的每一个传递给 free() 的要求。
记住 int(在 32 位系统上)可以处理 +/-2gig I.E. 10位数字+符号+换行符+NUL是一个(取决于OS)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
您的问题的简单解决方案。
#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;
}