如何从stdin到字符串获取值

时间:2020-08-10 19:00:51

标签: c

我只能使用退出,打开,关闭,写入,读取,malloc ,并且免费。 为什么不将缓冲区写入字符串?

file = 0;

char *ft_stdin(int file)
{
    char    buffer[BUFFER_SIZE + 1];
    char    *str_map;
    int     r;

    str_map = malloc(sizeof(*str_map) * BUFFER_SIZE + 1);
    while ((r = read(file, buffer, BUFFER_SIZE)) == '\0')
    {
        buffer[r] = '\0';
        str_map = buffer;
    }
    return (str_map);
}

1 个答案:

答案 0 :(得分:1)

  1. 您在函数内部声明了动态内存,这是错误的,因为您可以松开引用并从不释放内存,许多C函数将指针作为参数,因为程序员是在分配/释放内存。

  2. >
  3. 您要分配一个本地作用域内存地址,它在堆栈中到堆内存地址中,因此,当函数返回时,您会释放缓冲区内容,这与C语言中的noter languajes不同,您需要使用库函数。

因此,有这两个注释,您想这样做。

在分配内存的功能之外:

 char * str_map = malloc(.....);

并为此修改功能:

char *ft_stdin(int file, char * ptr)
{
    ....

    while ((r = read(file, buffer, BUFFER_SIZE)) == '\0')
    {
       buffer[r] = '\0';

       // Here you actually are copiying the string.
       for(int i = 0; i <= r; i++) {
          ptr[i] = buffer[i];
       }
    }
    return (str_map);
}

您需要确保不会溢出ptr变量,然后释放它。

如果需要,可以使用静态内存,但是关键概念是您不能返回本地函数作用域的内存地址,并且需要手动复制字符串或在C中通过strcpy复制字符串。