我编写了一个函数,其目标是将字符串标记化并将第一个标记作为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 *)?
我也对有关我的代码的任何更一般的建议感兴趣。
答案 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;
}