在fgets中的Segfault

时间:2014-12-05 06:48:00

标签: c fgets

#include<stdio.h>
#include<malloc.h>
#define MAX_N 10000
#define MAX_D 5000
int main(){
        char* n = malloc(MAX_D);
        fgets(n,MAX_D,0);
        printf("\n n : %s \n",n);
        return 0;
}

上述程序导致分段错误。无法确定根本原因。

5 个答案:

答案 0 :(得分:4)

char* fgets(char* str, int num, FILE * stream );

fgets的第三个参数是FILE *,而不是(POSIX)文件描述符,传递0被视为空指针。变化

fgets(n, MAX_D, 0);

为:

fgets(n, MAX_D, stdin);

答案 1 :(得分:1)

fgets的语法是 fgets(char* str, int num, FILE * stream);

您已使用fgets(n,MAX_D,0);

将第三个参数更改为stdin(标准输入 - 键盘)或将其指向某个文件。

可能您正在寻找fgets(n,MAX_D,stdin);

答案 2 :(得分:1)

我知道问题已经得到解答 这是另一种方法。

由于fgets()期望第三个参数为FILE *,因此 可以使用int

FILE *文件解码器转换为fdopen()

由于0文件描述符对应stdin,因此您可以使用以下内容。

fgets(n, MAX_D, 0);                 /* Incorrect */

fgets(n, MAX_D, stdin);             /* Correct */
fgets(n, MAX_D, fdopen(0, "r"));    /* Also Correct */

答案 3 :(得分:0)

试试那段代码

     #include<stdio.h>
     #include<malloc.h>
     #define MAX_N 10000
     #define MAX_D 5000
     int main()
    {
         char *n = malloc(MAX_D);
         fgets(n,MAX_D,stdin);     /* 0 means null */

        printf("\n n : %s \n",n);
       return 0;
   }

答案 4 :(得分:-1)

您忘记加入<stdlib.h>

这就是为什么在致电malloc()家人之后,总是要检查成功与否。在使用NULL中的指针之前进行fgets()检查。

此外,您需要在FILE *中使用fgets()作为第3个参数。在这里查看man page。在

fgets(n,MAX_D,0);

0更改为stdin以从标准输入中读取。