0

我编写了一个函数,其目标是对字符串进行标记并将前 n 个标记作为 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*)?

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

4

1 回答 1

0

您的内存分配几乎没有错误。例如:

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;
}
于 2013-10-01T13:34:52.900 回答