使用fgets()从stdin读取 [英] Reading from stdin using fgets()

查看:387
本文介绍了使用fgets()从stdin读取的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是C语言编程的新手,目前正在尝试使用fgets()从stdin读取一行,但是由于使用char *指向字符串I,我在内存分配方面遇到了麻烦想读.当我执行该文件时,它报告了分段错误.

I'm new to C programming and I'm currently trying to read a line from stdin using fgets(), but I'm having trouble with memory allocation since I'm using a char* to point to the string I want to read. When I execute the file it reports a segmentation fault.

这是我正在使用的功能:

This is the function I'm using:

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

推荐答案

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

The main mistake is to pass the pointer line to the function read_line (by value) and try to modify it in that function.

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

read_line allocates the memory and actually creates the pointer value. So it should be able to change the value of line in 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的返回值来修改mainline.在这种情况下,您根本不需要该参数:

Or, you use the return value of read_line in order to modify main's line. In that case you don't need the parameter at all:

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)指出)和备注:

Additional errors (pointed out by Jonathon Reinhart) and remarks:

  1. sizeof对于指针(阵列衰减到指针)不起作用.
  2. malloc许多字符串line,但您没有free他们.
  3. sizeof(char)始终为1.
  4. 有些人(我也是)认为应该避免强制转换malloc的结果.
  1. sizeof does not "work" for pointers (array decayed to pointers).
  2. You malloc many strings line but you do not free them.
  3. sizeof(char) is always 1.
  4. Some people (me too) think that casting the result of malloc should be avoided.

这篇关于使用fgets()从stdin读取的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆