2014-12-05 116 views
-1
#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; 
} 

上述程序导致段错误。找不到根本原因。fgets中的段错误

+2

难道是fgets(,, 0)? – Dinesh 2014-12-05 06:51:21

回答

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

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

fgets(n, MAX_D, 0); 

到:

fgets(n, MAX_D, stdin); 
+0

我会第二:) – Dinesh 2014-12-05 06:53:15

+0

是的..我错误的文件描述符到FILE * ..谢谢YU .. – Angus 2014-12-05 06:57:14

-1

你忘了包括<stdlib.h>

这就是为什么,呼吁malloc()家庭后,总是检查成功。在使用fgets()中的指针之前进行NULL检查。

另外,您需要使用FILE *作为fgets()中的第三个参数。在这里检查man page。在

fgets(n,MAX_D,0); 

变化0stdin从标准输入读取。

+1

不,这是因为gets不会在用户打印的'n'字符串中添加任何字符。 – 2014-12-05 06:52:55

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; 
    } 
1

用于与fgets的语法 fgets(char* str, int num, FILE * stream);

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

变化的第三个参数要么stdin(标准输入 - 键盘),或者它指向的一些文件。

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

1

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

由于fgets()预计第三个参数是FILE *
int文件decsriptor可以使用fdopen()

由于0文件描述符对应stdin,您可以使用下面的转换为FILE *

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

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

谢谢Saurabh。 – Angus 2015-01-10 15:24:40