创建2D动态字符串数组

时间:2017-01-10 19:50:01

标签: c

任何人都可以向我解释动态创建具有稳定第二维的2D字符串数组的最简单方法吗?我有一个带有一些字符串的txt文件,我想将这个txt传输到一个数组。所以我想将txt行号与第一维相关联,将字符串本身与第二维相关联。第二个维度是每一行中的字符数(这是稳定的,因为txt中的每一行都有一定的语法)所以,如果我有我的txt:

hello how (newline)
are youuu

*(我写了youuu,因为正如我所说,每一行都有相同数量的字符。)

我想要类似的东西:

array[0]["hello how"],
array[1]["are youuu"]

4 个答案:

答案 0 :(得分:2)

C中不允许使用非数字键。您尝试使用仅适用于数字的语言进行一些PHP和JavaScript废话。

但是,有了C,总有两条地狱之路。

char *lookup_key(int index, char *key) { ... }


printf(lookup_key(0, "hello how"));

答案 1 :(得分:2)

如果你知道字符串的长度和你拥有的数量,你可以像这样配置数组

char strings[numLines][strLen+1];
然后,您可以像这样访问数组

strcpy(strings[1], "test2");

如果你事先不知道任何事情,你需要一个指向指针数组的指针,然后使用malloc在数组增长时分配空间,完成时自由。

答案 2 :(得分:1)

C中的

dynamic 意味着您需要使用[c] [m] alloc之一为字符串创建内存。 2D 意味着char数组的数组。假设您知道字符串的数量和所需的最长字符串,以下内容将创建包含它们的内存:

char ** Create2DStr(ssize_t numStrings, ssize_t maxStrLen)
{
    int i;
    char **a = {0};
    a = calloc(numStrings, sizeof(char *));
    for(i=0;i<numStrings; i++)
    {
      a[i] = calloc(maxStrLen + 1, 1);
    }
    return a;
}

以下内容将释放上面创建的内存:

void free2DStr(char ** a, ssize_t numStrings)
{
    int i;
    for(i=0;i<numStrings; i++)
    {
        if(a[i]) free(a[i]);
    }
    free(a);
}

可以这样调用:

...
char **strArray = {0};
strArray = Create2DStr(10, 20);
//Use strArray...
free2DStr(10);

提供10个数组,每个数组包含20个char,加上NULL。 (+ 1之后的maxStrLen为NULL提供了额外的空间。

答案 3 :(得分:1)

如果要将文件的每一行保存为数组中的一行,请使用char的二维数组:

char fileContents[NUM_LINES][LINE_LENGTH + 1]; // +1 for zero terminator

如果你不知道前面有多少行,你需要做一些内存管理。首先,您需要分配一个初始范围:

#define INITIAL_EXTENT 20 // or some good starting point

char (*fileContents)[LINE_LENGTH + 1] = malloc( sizeof *fileContents * INITIAL_EXTENT );
if ( !fileContents )
{
  // malloc failed; fatal error
  fprintf( stderr, "FATAL: could not allocate memory for array\n" );
  exit( EXIT_FAILURE );
}
size_t numRows = INITIAL_EXTENT; // number of rows in array
size_t rowsRead = 0;             // number of rows containing data

当您从文件中读取时,您将检查以确保您在阵列中有空间;如果不这样做,则需要使用realloc调用来扩展数组,这可能是一项非常昂贵的操作。一种常见的技术是每次扩展时将数组的大小加倍 - 这样可以最大限度地减少realloc次调用的总数。如果你将数组大小加倍,那么风险是一些内部碎片,因为你只需要一行,但这可能是你可以分析的东西:

char tmpBuf[LINE_LENGTH + 2]; // account for newline in input buffer

while ( fgets( tmpBuf, sizeof tmpBuf, inputFile ) )
{
  /**
   * Check to see if you have any room left in your array; if not, 
   * you'll need to extend it.  You'll probably want to factor this 
   * into its own function.
   */
  if ( rowsRead == numRows ) 
  {
    /**
     * Use a temporary variable for the result of realloc in case of failure
     */
    char (*tmp)[LINE_LENGTH + 1] = 
      realloc( fileContents, sizeof *fileContents * ( 2 * numRows ) );

    if ( !tmp )
    {
      /**
       * realloc failed - we couldn't extend the array any more.  
       * Break out of the loop. 
       */
      fprintf( stderr, "ERROR: could not extend fileContents array - breaking out of loop\n" );
      break;
    }
    /**
     * Otherwise, set fileContents to point to the new, extended buffer
     * and update the number of rows.  
     */
    fileContents = tmp;
    numRows *= 2;
  }

  // strip the newline from the input buffer
  char *newline = strchr( tmpBuf, '\n' );
  if ( newline )
    *newline = 0;

  strcpy( fileContents[rowsRead++], tmpBuf );
}