【问题标题】:Tokenizing a string with strtok() causes crash in c使用 strtok() 标记字符串会导致 c 崩溃
【发布时间】:2014-05-13 14:26:02
【问题描述】:

我正在尝试创建一个函数,该函数使用给定的分隔符标记给定的字符串,将标记放入 2D 字符数组中并返回它。下面显示代码:

char** stringTokenizer(const char* str, const char* delims){
       char** tokens;
       size_t len = strlen(str);
       char localstr[len+1];
       int tokenslen=0;
       strcpy(localstr, str);
       tokens=malloc(sizeof(char*));

       char* tmp = strtok(localstr, delims);
       while(tmp){
                  if(++tokenslen>1) realloc(tokens, tokenslen*sizeof(char*));
                  tokens[tokenslen-1]=malloc((strlen(tmp)+1)*sizeof(char));
                  strcpy(tokens[tokenslen-1],tmp);
                  tmp = strtok(NULL, delims);
       }
       if(tokenslen==0){
                        free(tokens);
                        return NULL;

       } else return tokens;
}

当我尝试打印任何令牌时[i] 我遇到了崩溃。

只要有一个令牌,我就会增加令牌数组的大小并为要复制的令牌分配指针。

有什么建议吗?

谢谢!

【问题讨论】:

  • realloc(tokens, tokenslen*sizeof(char*)); :你放弃返回值。
  • cplusplus.com/reference/cstdlib/realloc 您需要将 realloc 的返回值捕获到一个变量中。 Realloc 可能会更改令牌指向的地址
  • @ChrisKon ;不保证 realloc 会扩展原始地址的内存剩余。
  • 最好让@BLUEPIXY 将其发布为答案,这样您就可以将问题标记为已回答。
  • @Varun:不要编辑问题来提供答案。有一个答案部分。我回滚了你的编辑(我猜批准它的审阅者有点高兴)。

标签: c string segmentation-fault tokenize strtok


【解决方案1】:

尝试这样做

char** stringTokenizer(const char* str, const char* delims){
       char** tokens = NULL;
       size_t len = strlen(str);
       char localstr[len+1];
       int tokenslen=0;
    char **temp;//Change
       strcpy(localstr, str);

       //tokens=malloc(sizeof(char*));

       char* tmp = strtok(localstr, delims);
       while(tmp){
                  //if(++tokenslen>1) realloc(tokens, tokenslen*sizeof(char*));
    temp = realloc(tokens, tokenslen*sizeof(char*));
    tokens = temp;
                  tokens[tokenslen-1]=malloc((strlen(tmp)+1)*sizeof(char));
                  strcpy(tokens[tokenslen-1],tmp);
                  tmp = strtok(NULL, delims);
       }
       /*if(tokenslen==0){
                        free(tokens);
                        return NULL;

       } else*/ return tokens;
}

谢谢@netcoder

【讨论】:

    猜你喜欢
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 2013-05-28
    • 2013-01-09
    相关资源
    最近更新 更多