мой код продолжает давать мне ошибки, когда я пытаюсь разбить его на три меньшие функции - PullRequest
0 голосов
/ 10 июля 2019

Я пытался передать значения по ссылке.программа читает одну строку каждый раз, когда вызывается функция get_next_line, и возвращает 1, если строка найдена, 0, если строка не найдена, и -1 для других ошибок, таких как сбой выделения памяти.код утечек, но сейчас моя главная проблема - сломать функцию get_next_line.

#include "get_next_line.h"

char *ft_strnew(size_t size)
{
    char *str;

    str = (char *)malloc(size + 1);
    if (!str)
        return (NULL);
    str[strlen(str) + 1] = '\0';
    return (str);
}

void *ft_memset(void *start, int init, size_t size)
{
    unsigned char *ptr;

    ptr = (unsigned char*)start;
    while (size > 0)
    {
        *ptr++ = (unsigned char)init;
        size--;
    }
    return (start);
}

void ft_bzero(void *s, size_t size)
{
    ft_memset(s, '\0', size);
}

char *ft_strjoin(char const *s1, char const *s2)
{
    char    *new;
    size_t  len;

    if (!s1 || !s2)
        return (NULL);
    len = strlen((char *)s1) + strlen((char *)s2);
    new = (char *)malloc(len + 1);
    if (!new)
        return (NULL);
    while (*s1 != '\0')
        *new++ = *s1++;
    while (*s2 != '\0')
        *new++ = *s2++;
    *new = '\0';
    return (new - len);
}

char *ft_strdup(const char *str)
{
    char    *strdup;
    int     i;

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

static char *read_line(int f, int fd, char *buff, char *temp)
{
    int i;

    i = 0;
    while (f > 0)
    {
        if (buff[i] == '\n'){
            break;
        }
        else if (i == BUFF_SIZE)
        {
            f = read(fd, buff, BUFF_SIZE);
            if (f == 0)
            {
                if (BUFF_SIZE == 1)
                    return (temp);      
                return ((char *)LINE_NOT_FOUND);
            }
            temp = ft_strjoin(temp, buff);
            i = -1;
        }
        i++;
    }
    return (temp);
}

int get_next_line(const int fd, char **line)
{
    static t_var var;
    char buff[BUFF_SIZE + 1];
    char *new;
    int i;
    int f = 0;
    int s = 0;
    int w = 0;
    i = 0;

    if (fd <  0 || line == NULL)
        return (INVALID);
    ft_bzero(buff, BUFF_SIZE + 1);
    if (var.j > 0)
    {
        new = (char *)malloc(sizeof(char) * (var.j + 1));
        if (!new)
            return (INVALID);
        s = strlen(var.temp) - var.j;
        f = s;
        w = var.j;
        while (var.temp[s] != '\0')
        {
            new[i] = var.temp[s];
            if (var.temp[s] == '\n')
            {
                if(!(*line = (char *)malloc(sizeof(char) * (i + 1))))
                    return (INVALID);
                *line = strncpy(*line, new, i);
                var.j--;
                return (LINE_FOUND);
            }
            s++;
            var.j--;
            i++;
        }
        s = f;
        var.temp = ft_strdup(new);
    }//first read after this if statement
    if (w == 0)
        var.temp = ft_strnew(BUFF_SIZE);
    f = read(fd, buff, BUFF_SIZE);
    if (f == 0)
        return (LINE_NOT_FOUND);
    var.temp = ft_strjoin(var.temp, buff);
    var.temp = read_line(f, fd, buff, var.temp);//function call 
    if (var.temp == (char *)LINE_NOT_FOUND)
        return (0);
    s = 0;
    if (var.temp[s])
    {
        while (var.temp[s] != '\n')
            s++;
    }
    s++;
    if(var.j == 0)
        *line = (char *)malloc(sizeof(char) * (s + 1));
    *line = strncat(*line, var.temp, s - 1);
    var.j = strlen(var.temp) - s;
    return (LINE_FOUND);
}

#include <fcntl.h>
int main(int argc, char **argv)
{
    int     fd;
    char    *line;
    int     x = 1;

    if (argc > 1)
    {
        fd = open(argv[1], O_RDONLY);
        while (x == 1)
        {
            x = get_next_line(fd, &line);
            if (x > 0)
                printf("%s\n", line);
        }
        close(fd);
    }
    return (0);
}

1 Ответ

4 голосов
/ 10 июля 2019

В str[strlen(str) + 1] = '\0'; и s = strlen(var.temp) - var.j; вы вызываете strlen для вещей, которые являются , а не строками.Только действительная строка может быть передана в strlen.Посмотрите на этот код:

str = (char *)malloc(size + 1);
if (!str)
    return (NULL);
str[strlen(str) + 1] = '\0';

Вы передаете str в strlen, даже если вы только что выделили его и он указывает на буфер, который содержит случайный мусор.Тебе этого не сделать.Контракт интерфейса для strlen говорит, что вы должны передать ему указатель на память, которая содержит строку.Случайный мусор может быть или не быть допустимой строкой.

То же самое относится к var.temp, когда вы передаете его в strlen.Он не содержит допустимой строки, потому что вы еще не поместили в нее правильную строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...