有些主题与此部分重叠,但我仍在寻求答案。
令牌化部分工作正常,但动态内存分配似乎不是,基于取消注释打印循环时的段错误。
free()只是检查free()是否有效,而不是成为完成函数的一部分,它返回NULL直到它返回一些合理的东西。
sep通常是一个空间。线路末端的任何\ n在到达之前都会得到处理。
char ** chunkify(char *line, char *sep)
{
printf("%s\n", line);
char **array = malloc(sizeof(char *));
int token_count = 0;
char *token = NULL;
token = strtok(line, sep);
while( token != NULL )
{
printf("\t%s\n", token);
array = realloc(array,(token_count + 1) * sizeof(char *));
array[token_count] = malloc(strlen(token) + 1);
strcpy(array[token_count],token);
token = strtok(NULL, sep);
token_count++;
}
/*
int j;
for ( j=0 ; *(array+j) ; ++j)
{
printf("\t%s\n", *(array+j));
free(*(array+j)); // just to see if it frees cleanly
}
free(array);
*/
return NULL; // will return array when it's fixed
}
答案 0 :(得分:0)
您应该使用空指针追加指针数组。否则,不知道数组包含多少元素。
如果您使用的方法不够智能,因为它没有报告分配错误,那么该函数可以看起来像在此演示程序中所示。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char ** chunkify( char *line, const char *sep )
{
char **array = malloc( sizeof( char * ) );
if ( array )
{
size_t n = 1;
char *token = strtok( line, sep );
while ( token )
{
char **tmp = realloc( array, ( n + 1 ) * sizeof( char * ) );
if ( tmp == NULL ) break;
array = tmp;
++n;
array[ n - 2 ] = malloc( strlen( token ) + 1 );
if ( array[ n - 2 ] != NULL ) strcpy( array[ n - 2 ], token );
token = strtok( NULL, sep );
}
array[ n - 1 ] = NULL;
}
return array;
}
int main(void)
{
char s[] = "Hello World";
char **array = chunkify( s, " " );
if ( array != NULL )
{
for ( char **p = array; *p; ++p ) puts( *p );
for ( char **p = array; *p; ++p ) free( *p );
free( array );
}
return 0;
}
程序输出
Hello
World