我的tokenize函数没有返回并抱怨损坏的双链表

时间:2013-10-01 13:02:45

标签: c

我编写了一个函数,其目标是将字符串标记化并将第一个标记作为char *数组返回。

最初,我有一个标记字符串的函数,但不返回任何内容(只是为了测试):

void tokenize_1(char *str,const int n){
  char delims[] = " \t,:";
  char *result=NULL;
  int i=0;
  char *s=malloc(sizeof(char*)*10);
  strcpy(s,str);
  result = strtok(str, delims );
  while( result != NULL ) {
    i++;
    printf( "\nresult is \"%s\"", result);
    result = strtok( NULL, delims );
  }
  printf("\n");
}

然后,我想返回一个n char *:

的数组
char **tokenize(char *str,const int n){
  char delims[] = " \t,:";
  char **result=malloc(n*sizeof(char*));
  int i=0;
  char *s=malloc(sizeof(char*)*10);
  strcpy(s,str);
  result[i] = strtok(s, delims );
  while( result[i] != NULL ) {
    printf( "\nresult is \"%s\"", result[i]);
    i++;
    result[i] = strtok( NULL, delims );
  }
  printf("\n");
  return result;
}

结果似乎是正确的。但是我的程序没有返回并打印消息:

  

*检测到glibc * ./program:损坏的双链表

这有什么问题?如何修改第一个函数以返回一个字符串数组(如char *)?

我也对有关我的代码的任何更一般的建议感兴趣。

1 个答案:

答案 0 :(得分:0)

内存分配错误很少..eg:

char **result=malloc(n*sizeof(char*));
char *s=malloc(sizeof(char*)*10);

这些应该是:

char **result=malloc(n*sizeof(char)*MAX_TOKEN_LENGTH);
char *s=(char *)malloc(sizeof(char)*strlen(str) + 1);

你也需要纠正这种情况:

while( result[i] != NULL )

它应该在生成n个令牌后停止。

while( (result[i] != NULL) && (i < n)  )

这是我尝试使用你的功能:

#include<string.h>

#define MAX_TOKEN_LENGTH 100

char **tokenize(char *str,const int n){
  char delims[] = " \t,:";
  char **result=malloc(n*sizeof(char)*MAX_TOKEN_LENGTH);
  int i=0;
  char *s=(char *)malloc(sizeof(char)*strlen(str) + 1);
  strcpy(s,str);
  result[i] = strtok(s, delims );
  while( (result[i] != NULL) && (i < n)  ) {
  //printf( "\nresult is \"%s\"", result[i]);
  i++;
  result[i] = strtok( NULL, delims );
  }
  printf("\n");
  return result;
}

int main(){
char **result;
int i;
int number_of_tokens = 4;
result = tokenize("hi i am: abhipranay,a\tchauhan",number_of_tokens);
for(i=0;i < number_of_tokens; i++){
    printf("%s\n",(result[i]));
}
return 0;
}