2013-07-19 60 views
0

我需要一個函數來重現另一個程序的getline函數的基本功能,這個函數應該能夠正確讀取一個FP並且沒有巨大的緩衝區(這裏256應該已經足夠了) 我有2個下面 的代碼問題 - 功能開始返回緩衝區時,exeeded,此文件例如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)'這'北京時間的sizeof(字符*)'。但是,這不僅使緩衝區過大的應該不會造成任何問題 –

+0

固定的,我知道我沒有對malloc ** converted_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

'如果(我<= MOAR_BUF &&保存[i]!='\ 0')'更多的越界訪問。修復超出界限的錯誤,如果在此之後仍然不起作用,請給我們一個錯誤的例子。除此之外,你泄漏內存,你永遠不會釋放你的任何'malloc'指針,但這可能只是爲了這裏的代碼。 –

+0

@Saxtheowl除了超出邊界訪問範圍外,在分配之前嘗試打印'converted_map [i]'看起來像是麻煩的原因。 –