函数串联了多余的字符

时间:2018-10-26 07:37:11

标签: c

我正在编写一个应读取长度未知的字符串的函数。我可以使用read,malloc,open,close和我自己的库,其行为类似于普通的库。它包括标准库中的功能和一些其他功能。

问题是fill_append()将字符串从gnl->buf复制到*line错误。除了复制字符串本身之外,它还会添加其他字符。带有ft_前缀的函数可以正常工作。

int fill_append(t_gnl* gnl, char** line)
{
    char* append;
    int index;
    char* sub;
    char* tmp;

    append = ft_strchr(gnl->buf, '\n');
    if (append == NULL)
    {
        *line = ft_strdup(gnl->buf);
        return (0);
    }
    index = (int)(append - gnl->buf);
    sub = ft_strsub(gnl->buf, 0, index);

    tmp = ft_strnew(ft_strlen(*line) + ft_strlen(sub) + 1);
    ft_strcpy(tmp, *line);
    ft_strcat(tmp, sub);
    *line = tmp;

    // tmp = (char *)malloc(ft_strlen(*line) + ft_strlen(sub) + 1);
    // memcpy(tmp, *line, ft_strlen(*line));
    // memcpy(tmp + ft_strlen(*line), sub, ft_strlen(sub) + 1);
    // *line = tmp;
    gnl->buf = ft_strdup(&gnl->buf[index + 1]);
    return (1);
}

int read_fd(t_gnl* gnl, char** line)
{
    int bsize;
    char* tmp;

    while ((bsize = read(gnl->fd, gnl->buf, BUFF_SIZE)))
    {
        gnl->buf[bsize] = '\0';
        if (ft_strchr(gnl->buf, '\n') == NULL)
        {
            tmp = *line;
            *line = ft_strjoin(*line, gnl->buf);
            free(tmp);
            free(gnl->buf);
            gnl->buf = ft_strnew(BUFF_SIZE);
        }
        else
            return (fill_append(gnl, line));
    }
    if (bsize == 0 && *line[0] == 0)
    {
        free(gnl->buf);
        return (0);
    }
    return (1);
}

int get_next_line(const int fd, char** line)
{
    static t_gnl* gnl;

    if (fd < 0 || line == NULL)
        return (-1);
    *line = ft_strnew(0);
    if (gnl)
        if (gnl->buf)
            if (fill_append(gnl, line))
                return (1);
    if (!gnl)
        gnl = (t_gnl*)malloc(sizeof(t_gnl));
    gnl->buf = ft_strnew(BUFF_SIZE);
    gnl->fd = fd;
    return (read_fd(gnl, line));
}

例如,输入为sfesefsefsefwefsefsefsef sfesefsefsefwefsefsefsef的函数将返回sfesefsefsefwefsefsefsef1 sfesefsefsefwefsefsefsef!

标题:

#ifndef GET_NEXT_LINE_H
#define GET_NEXT_LINE_H

#define BUFF_SIZE 150

#include <unistd.h>
#include <stdlib.h>
#include "libft/libft.h"

typedef struct s_gnl
{
    char* buf;
    int fd;
} t_gnl;

int get_next_line(const int fd, char** line);

#endif

主要:

#include <stdlib.h>
#include <fcntl.h>
#include "get_next_line.h"
#include "libft/libft.h"

int main(void)
{
    int fd;
    char* line;

    fd = open("gnl.txt", O_RDONLY);

    while (get_next_line(fd, &line))
    {
        ft_putendl(line);
        ft_strdel(&line);
    }

    close(fd);
}

0 个答案:

没有答案