[英]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
並且您釋放原始指針會導致內存泄漏。
各種問題
strcat(buffer, (const char*)toparse[i]);
嘗試將char
更改為字符串。
strings = realloc(strings, sizeof(buffer)+1);
重新分配相同數量的空間。 sizeof(buffer)
是指針buffer
的大小,而不是它指向的內存的大小。
調用函數無法知道strings
多少個條目。 建議並設置NULL
標記。
次要:最好使用size_t
而不是int
。 使用更具描述性的名稱。 不要重復調用strlen(toparse)
。 使用for(int i=0; toparse[i]; i++)
。 使toparse
為const char *
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.