2013-07-19 2 views
0

Мне нужна функция, которая воспроизводит базовую функцию getline для другой программы, эта функция должна иметь возможность правильно читать FP и без огромного буфера (здесь должно быть достаточно 256) У меня есть 2 проблема в коде ниже - функция начинает возвращать неверную информацию при извлечении буфера, например, для этого файла http://pastebin.com/BXj3SH92 (./a.out <) - когда я вызываю свою функцию, не указывая ее на файл, она должна работать так же, как кошка, но остановить после того, как я нажать первую клавишу ввода (./a.out)Функция перекодировки getline на C

вот код:

#define MOAR_BUF 256 

#include <stdlib.h> 
#include <fcntl.h> 
#include <string.h> 
#include <stdio.h> 

char   *my_getline(const int fd) 
{ 
    static char save[MOAR_BUF]; 
    static int i = MOAR_BUF; 
    int   g; 
    int   f; 
    char   *save2; 

    save2 = NULL; 
    g = 0; 
    f = 0; 
    if (g == 0 && i >= (MOAR_BUF -1)) 
    { 
     i = 0; 
     g = read(fd, save, MOAR_BUF + 1); 
     save[g] = '\0'; 
    } 
    if (i <= MOAR_BUF && save[i] != '\0') 
    { 
     save2 = malloc((sizeof(*save2) * MOAR_BUF)); 
     while(save[i] != '\n' && save[i] != '\0') 
     save2[f++] = save[i++]; 
     save2[f] = '\0'; 
     if (save[i] != '\0') 
     i = i + 1; 
    } 
    return(save2); 
} 

int    main() 
{ 
    int   i; 
    char   **converted_map; 
    char   *map; 

    i = 0; 
    converted_map = malloc(sizeof(*converted_map) * 30); 
    while(map = my_getline(0)) 
    { 
     converted_map[i] = strdup(map); 
     printf("%s\n", converted_map[i]); 
     i++; 
    } 
} 
+1

Ваш 'malloc()' не совсем корректен: вы умножаете 'MOAR_BUF' на' sizeof (save2) ', который ist' sizeof (char *) '. Но это только делает буфер слишком большим, и не должен вызывать никаких проблем. –

+0

исправлено. Я понимаю, что мне не нужно malloc ** convert_map, кстати, я не знаю, почему – Saxtheowl

ответ

3
static char save[MOAR_BUF]; 

g = read(fd, save, MOAR_BUF); 
save[g] = '\0'; 

Вы говорите read читать MOAR_BUF байт, и когда он преуспевает читал, что много, 0-терминации пишет мимо конца массива, вызывая неопределенное поведение.

Вы должны указать read, чтобы прочитать меньшее количество байтов, например MOAR_BUF - 1, или сделать буфер более крупным, например MOAR_BUF + 1.

Затем в main,

while(map = my_getline(0)) 
{ 
    printf("%s\n", converted_map[i]); 
    converted_map[i] = strdup(map); 
    i++; 
} 

распечатанной converted_map[i], прежде чем он назначен, это более неопределенное поведение. Вам необходимо связаться с strdup(map) до converted_map[i], затем вы можете распечатать его.

+0

он работает для небольшого файла, но когда MOAR_BUF превышает его значение, я начинаю имеют неправильный ответ – Saxtheowl

+0

'if (i <= MOAR_BUF && save [i]! = '\ 0')' более доступный доступ к границам. Исправьте ошибки вне границ, если они все еще не работают после этого, дайте нам пример того, что пойдет не так. Кроме того, вы утечка памяти, вы никогда не «освобождаете» любые ваши указатели malloc, но это может быть только для кода здесь. –

+0

@Saxtheowl Помимо доступа к внешним ограничениям, тот факт, что вы пытаетесь распечатать 'convert_map [i]' перед тем, как он назначен, выглядит как причина проблемы. –