使用fgets()从stdin读取

时间:2016-11-03 22:03:28

标签: c pointers segmentation-fault malloc fgets

我是C编程的新手,我目前正在尝试使用fgets()从stdin读取一行,但是由于我使用的是char *指向我想要阅读的字符串。当我执行文件时,它会报告分段错误。

这是我使用的功能:

char *read_line(char *line){
    printf("%s",PROMPT);
    line = (char*)malloc(sizeof(char)*500);
    fgets(line,sizeof(line),stdin);
    printf("%s","pasa el fgets");
    return line;
}

我的主要人物:

void main(){
    char line0;
    char *line=&line0;
    while(read_line(line)){
        execute_line(line);
    }
}

1 个答案:

答案 0 :(得分:2)

主要的错误是将指针line传递给函数read_line(按值)并尝试在该函数中修改它。

read_line分配内存并实际创建指针值。因此,它应该能够更改line中的main的值:

char *read_line(char **line){
    ...
    *line = malloc(500);
    fgets(*line, 500, stdin);
    ...
    return *line;
}

int main(void) {
    char *line;
    while(read_line(&line)){
        ...
    }

}

或者,您使用read_line的返回值来修改main' s line。在这种情况下,您根本不需要参数:

char *read_line(void) {
    char *line;
    ...
    line = malloc(500);
    fgets(line, 500, stdin);
    ... 
    return line;
}

int main(void) {
    char *line;
    while(line = read_line()){
        ...
    }
}

其他错误(Jonathon Reinhart指出)和评论:

  1. sizeof没有"工作" for pointers(数组衰减为指针)。
  2. malloc多个字符串line,但您没有free
  3. sizeof(char)始终为1。
  4. 有些人(我也是)认为应该避免投射malloc的结果。