首页 文章

使用fgets()从stdin读取

提问于
浏览
1

我是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 回答

  • 2

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

    read_line 分配内存并实际创建指针值 . 所以它应该能够在 main 中更改 line 的值:

    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 的返回值来修改 mainline . 在这种情况下,您根本不需要参数:

    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指出)和评论:

    • sizeof 对于指针不是"work"(数组衰减为指针) .

    • malloc 许多字符串 line 但你没有 free 他们 .

    • sizeof(char) 始终为1 .

    • 有些人(我也是)认为应该避免投射 malloc 的结果 .

相关问题