2014-05-13 51 views
1

我试图创建一个函数,用给定的定界符标记给定的字符串,将标记放入2D字符数组并将其返回。下面的代码显示:使用strtok()标记字符串会导致崩溃c

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; 
} 

当我尝试打印任何令牌[我]即时通讯崩溃。

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

有什么建议吗?

谢谢!

+0

你应该考虑双指针在这里:'令牌=的malloc(的sizeof(字符*));'ATLEAST。 – tod

+0

你如何印制代币? – MicroVirus

+5

'realloc(tokens,tokenslen * sizeof(char *));':你放弃返回值。 – BLUEPIXY

回答

0

尝试做这个

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