使用strtok,malloc和realloc从字符串中创建一个标记数组

时间:2017-07-26 20:35:28

标签: c arrays malloc realloc strtok

有些主题与此部分重叠,但我仍在寻求答案。

令牌化部分工作正常,但动态内存分配似乎不是,基于取消注释打印循环时的段错误。

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
}

1 个答案:

答案 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