如何在 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 的指针,其余两个作为 chars.

其次(这里没有太大关系,但总的来说很重要),你没有为你想使用的指针分配内存(如果有的话)。

如果你有一个固定的输入长度决定为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;
}