如何在C中使用fgets从用户那里获取内容?

时间:2015-09-14 20:29:29

标签: c pointers fgets

我是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.

4 个答案:

答案 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;
}