[英]String split function with delimiters in C
我在編寫帶分隔符的字符串拆分函數時遇到麻煩。 我的功能基於此處的主要功能: http : //www.cplusplus.com/reference/cstring/strtok/ 。
通過main測試時,只能傳遞char [],而不能傳遞char *。 傳遞char *時,程序段錯誤。
即通過str_split傳遞一些char str [],而不傳遞一些char * str。 任何幫助將不勝感激。
char** str_split(char* str, const char* delim)
{
char* tmp;
char** t = (char**)malloc(sizeof(char*) * 1024);
char** tokens = t;
tmp = strtok(str, delim);
while(tmp != NULL)
{
*tokens = (char*)malloc(sizeof(char) * strlen(tmp));
*tokens = strdup(tmp);
tokens++;
tmp = strtok(NULL, delim);
}
return t;
}
通過main測試時,只能傳遞char [],而不能傳遞char *。 傳遞char *時,程序段錯誤。
遇到上述情況的原因是您沒有在main
為char *
分配內存,或者您正在傳遞字符串文字。
這兩行給您兩個不同的問題:
*tokens = (char*)malloc(sizeof(char) * strlen(tmp));
*tokens = strdup(tmp);
第一行將分配strlen(tmp)
字節,但是問題是字符串有一個額外的字符來終止字符串,因此您確實需要分配strlen(tmp) + 1
個字節。
第二行覆蓋從malloc
的原始指針,從而導致內存泄漏。
同樣,在C語言中,您不應該轉換malloc
的返回值 。
哦,還有另一個注意事項:無論char
類型的實際位大小如何, sizeof(char)
被指定為始終返回1
。
至於您的段錯誤,我猜您正在用字符串文字調用函數,例如
some_var = str_split("hello world", " ");
或者可能
char *string = "hello world";
some_var = str_split(string, " ");
這將導致不確定的行為 ,因為字符串文字實際上是指向恆定字符數組的指針,並且strtok
修改字符串。 未定義的行為可以說是最常見的崩潰原因。
如果在構建時啟用更多警告,則可能會收到有關此警告,或者您確實得到了警告但忽略了它,或者使用了強制轉換來消除它。 來自編譯器的警告通常可以很好地指示您執行了不應執行的操作,例如通過強制轉換將其隱藏起來只會使警告靜音,而不能解決問題。
您的代碼還存在其他一些問題。 一種是,如果傳遞給函數的“句子”中只有一個“單詞” /“令牌”,則會在該分配中浪費4092
或8184
字節(取決於32位或64位平台)。 您可能想先執行一個單獨的標記化循環(在字符串的臨時副本上),以找出輸入中“標記”或“單詞”的確切數目。
這樣做計數也會解決另一個問題:如果有超過 1024個代幣/詞? 在這種情況下,您的循環將很高興地超出范圍。
這兩種情況都是極端情況,您的標准用例可能更適合您的當前代碼,但這仍然值得考慮。
您可能在聲明時為char *賦值
char *str="abcdef";
否則您可能沒有為char * str
指向的字符串分配內存。 在這兩種情況下, strtok()
都會導致segmentation fault
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.