簡體   English   中英

C中帶有分隔符的字符串拆分功能

[英]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 *時,程序段錯誤。

遇到上述情況的原因是您沒有在mainchar *分配內存,或者您正在傳遞字符串文字。

這兩行給您兩個不同的問題:

*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 修改字符串。 未定義的行為可以說是最常見的崩潰原因。

如果在構建時啟用更多警告,則可能會收到有關此警告,或者您確實得到了警告但忽略了它,或者使用了強制轉換來消除它。 來自編譯器的警告通常可以很好地指示您執行了不應執行的操作,例如通過強制轉換將其隱藏起來只會使警告靜音,而不能解決問題。


您的代碼還存在其他一些問題。 一種是,如果傳遞給函數的“句子”中只有一個“單詞” /“令牌”,則會在該分配中浪費40928184字節(取決於32位或64位平台)。 您可能想先執行一個單獨的標記化循環(在字符串的臨時副本上),以找出輸入中“標記”或“單詞”的確切數目。

這樣做計數也會解決另一個問題:如果有超過 1024個代幣/詞? 在這種情況下,您的循環將很高興地超出范圍。

這兩種情況都是極端情況,您的標准用例可能更適合您的當前代碼,但這仍然值得考慮。

您可能在聲明時為char *賦值

char *str="abcdef";

否則您可能沒有為char * str指向的字符串分配內存。 在這兩種情況下, strtok()都會導致segmentation fault

暫無
暫無

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

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