簡體   English   中英

在C中解析CSV值

[英]Parsing CSV Values in C

我試圖用C編寫一個基本的CSV解析器,當給定一個char*和一個分隔符(例如逗號)時,該解析器生成char*的動態數組:

char **filldoc_parse_csv(char *toparse, char sepchar)
{
    char **strings = NULL;

    char *buffer = NULL;

    int j = 0;
    int k = 1;

    for(int i=0; i < strlen(toparse); i++)
    {
        if(toparse[i] != sepchar)
        {
            buffer = realloc(buffer, sizeof(char)*k);
            strcat(buffer, (const char*)toparse[i]);
            k++;
        }
        else
        {
            strings = realloc(strings, sizeof(buffer)+1);

            strings[j] = buffer;

            free(buffer);

            j++;

        }
    }

    return strings;


}

但是,當我按以下方式調用函數時:

char **strings = filldoc_parse_csv("hello,how,are,you", ',');

我最終遇到了細分錯誤:

Program received signal SIGSEGV, Segmentation fault.
__strcat_sse2 () at ../sysdeps/x86_64/multiarch/../strcat.S:166
166 ../sysdeps/x86_64/multiarch/../strcat.S: No such file or directory.
(gdb) backtrace
#0  __strcat_sse2 () at ../sysdeps/x86_64/multiarch/../strcat.S:166
#1  0x000000000040072c in filldoc_parse_csv (toparse=0x400824 "hello,how,are,you", sepchar=44 ',') at filldocparse.c:20
#2  0x0000000000400674 in main () at parsetest.c:6

問題集中在為緩沖區字符串分配足夠的空間。 如果需要,我將使緩沖區成為靜態數組,但是,我想為此目的使用動態內存分配。 如何正確執行?

您的內存分配有問題。 當您執行例如sizeof(buffer)您將獲得指針的大小,而不是指針指向的大小。 這意味着您將在第一次運行中分配5個字節(在32位系統上),而下次調用該函數時,您將再次分配5個字節。

還有許多其他問題,例如將指針分配給strings[j]釋放buffer指針。 這樣做的問題是分配僅復制指針,而不復制指針指向的指針,因此通過釋放buffer您還可以釋放strings[j]

以上兩個問題都會導致您的程序具有不確定的行為 ,這是運行時崩潰的最常見原因。

您還應該避免將realloc的結果分配給您嘗試重新分配的指針,因為如果realloc失敗,它將返回NULL並且您釋放原始指針會導致內存泄漏。

各種問題

  1. strcat(buffer, (const char*)toparse[i]); 嘗試將char更改為字符串。

  2. strings = realloc(strings, sizeof(buffer)+1); 重新分配相同數量的空間。 sizeof(buffer)是指針buffer的大小,而不是它指向的內存的大小。

  3. 調用函數無法知道strings多少個條目。 建議並設置NULL標記。

次要:最好使用size_t而不是int 使用更具描述性的名稱。 不要重復調用strlen(toparse) 使用for(int i=0; toparse[i]; i++) 使toparseconst char *

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM