Get_next_line :在 Mac 上当 BUFFER_SIZE 介于 8 和 15 之间时中止

问题描述

我目前正在完成我的“Get_next_line”项目。它是一个读取文件函数,并允许您从文件描述符中读取以换行符结尾的行。当您在同一个文件上再次调用函数时,它会抓取下一行。该项目处理内存分配以及何时释放和分配内存以防止泄漏。如果发生错误,则返回值 (-1),如果文件读取完成则返回 (0),如果读取一行则返回 (1)

但是,在测试我的最终代码时,当 BUFFER_SIZE 介于 8 和 15 之间时,我遇到中止。此错误仅出现在 Mac 上。有没有人知道可能是什么问题?

编译:

gcc -Wall -Wextra -Werror -D BUFFER_SIZE=32 get_next_line.c get_next_line_utils.c

get_next_line() 函数和一些支持代码

#include "get_next_line.h"

int ft_backslash(const char *s)
{
    int i;

    i = -1;
    while (s[++i])
        if (s[i] == '\n')
            return (1);
    if (s[i] == '\n')
        return (1);
    return (0);
}

int ft_read_buffer(int fd,char *buf)
{
    int     ret;

    ret = 0;
    ret = read(fd,buf,BUFFER_SIZE);
    if (ret < 0)
        return (-1);
    buf[ret] = '\0';
    return (ret);
}

char    *ft_treat_save(char *save,char *buf)
{
    char    *tmp;

    if (save == NULL)
        save = ft_strdup(buf);
    else
    {
        tmp = ft_strdup(save);
        free (save);
        save = ft_strjoin(tmp,buf);
        free (tmp);
    }
    return (save);
}

char    *ft_treat_tmp(char *save)
{
    char    *tmp;

    tmp = ft_strdup(save);
    free (save);
    return (tmp);
}

int get_next_line(int fd,char **line)
{
    int         ret;
    char        buf[BUFFER_SIZE];
    char        *tmp;
    static char *save;

    ret = 1;
    if (fd < 0 || fd > 255 || BUFFER_SIZE <= 0 || line == NULL)
        return (-1);
    *line = NULL;
    tmp = NULL;
    while (ret > 0)
    {
        if ((ret = ft_read_buffer(fd,buf)) < 0)
            return (-1);
        save = ft_treat_save(save,buf);
        if (ft_backslash(save) == 1)
        {
            tmp = ft_treat_tmp(save);
            *line = ft_strcut_front(tmp);
            save = ft_strcut_back(tmp);
            return (1);
        }
    }
    tmp = ft_treat_tmp(save);
    save = NULL;
    *line = ft_strdup(tmp);
    free (tmp);
    return (0);
}

其他支持代码

size_t  ft_strlen(char *str)
{
    size_t  i;

    i = 0;
    if (str)
        while (str[i])
            i++;
    return (i);
}

char    *ft_strdup(char *str)
{
    int     i;
    char    *dst;

    dst = malloc(sizeof(char) * ((ft_strlen(str) + 1)));
    if (!(dst))
    {
        free (dst);
        return (NULL);
    }
    i = -1;
    while (str[++i])
        dst[i] = str[i];
    dst[i] = '\0';
    return (dst);
}

char    *ft_strjoin(char *s1,char *s2)
{
    int     i;
    int     j;
    char    *join;

    i = -1;
    j = 0;
    if (!s1 && !s2)
        return (NULL);
    join = malloc(sizeof(char) * (ft_strlen(s1) + ft_strlen(s2) + 2));
    if (!(join))
        return (NULL);
    if (BUFFER_SIZE == 1)
        while (s1[++i + 1] != '\0')
            join[i] = s1[i];
    else
        while (s1[++i] != '\0')
            join[i] = s1[i];
    while (s2[j])
        join[i++] = s2[j++];
    join[i] = '\0';
    return (join);
}

char    *ft_strcut_front(char *str)
{
    int     i;
    char    *front;

    i = 0;
    while (str[i] != '\n')
        i++;
    front = malloc(sizeof(char) * (i + 1));
    if (!(front))
        return (NULL);
    i = 0;
    while (str[i] != '\n')
    {
        front[i] = str[i];
        i++;
    }
    front[i] = '\0';
    return (front);
}

char    *ft_strcut_back(char *str)
{
    int     i;
    int     j;
    char    *back;

    i = 0;
    while (str[i] != '\n')
        i++;
    i++;
    back = malloc(sizeof(char) * ((ft_strlen(str) - i) + 1));
    if (!(back))
        return (NULL);
    j = 0;
    while (str[i] != '\0')
        back[j++] = str[i++];
    back[j] = '\0';
    free (str);
    return (back);
}

main() 函数

int          main(void)
{
    int fd,ret,line_count;
    char *line;

    line_count = 1;
    ret = 0;
    line = NULL;
    fd = open("baudelaire.txt",O_RDONLY);
    while ((ret = get_next_line(fd,&line)) > 0)
    {
        printf(" \n [ Return: %d ] | A line has been read #%d => |%s|\n",line_count,line);
        line_count++;
    }
    printf(" \n [ Return: %d ] A line has been read #%d: |%s\n",line_count++,line);
    printf("\n");
    if (ret == -1)
        printf("-----------\n An error happened\n");
    else if (ret == 0)
    {
        printf("-----------\n EOF has been reached\n");
    }
    close(fd);
}

解决方法

问题解决了。我忘了将 + 1 添加到我的 buf 大小......愚蠢的错误!谢谢