【问题标题】:How to create an array of strings based on a variable in C如何根据C中的变量创建字符串数组
【发布时间】:2020-10-14 22:03:21
【问题描述】:

我正在尝试基于如下变量创建一个字符串数组。

char* stringArray[3];
for(int i = 0; i < 3; i++) {
   sprintf(stringArray[i], "string%d", i);
}

这将创建以下数组 ["string0", "string1", "string2"]。 但是,这似乎无效并给我一个内存错误。在 C 中实现此目的的正确方法是什么?

【问题讨论】:

    标签: arrays c string


    【解决方案1】:

    您已经创建了指针,但没有存储内容。

    任一字符

    stringArray[3][100]; // 99 chars +1 null
    

    for(int i = 0; i < 3; i++) {
    
       stringArray[i]=malloc(100); // create memory
    
       sprintf(stringArray[i], "string%d", i);
    }
    

    【讨论】:

      【解决方案2】:

      你已经为三个指针分配了内存,但是你还没有分配内存来存储每个字符串。每个stringArray[i] 都需要指向一个足够大的缓冲区来存储最终的字符串。这在 C 中不会自动发生,您必须确保已分配内存来存储字符串本身。

      对于这样的事情,你已经知道字符串的数量和每个字符串的最大长度,你只需要分配一个char的二维数组:

      char stringArray[3][8]; // "string" plus 1 digit plus string terminator
      
      for ( int i = 0; i < 3; i++ )
        sprintf( stringArray[i], "string%d", i );
      

      对于事先不知道每个字符串的长度的情况,您需要像现在一样分配指针数组,然后在知道每个字符串的长度后进行单独的动态分配:

      char *stringArray[3];
      
      for ( int i = 0; i < 3; i++ )
      {
        stringArray[i] = malloc( length_of_this_string() ); 
        if ( stringArray[i] )
          strcpy( stringArray[i], this_string );
      }
      

      【讨论】:

        【解决方案3】:

        在C语言中,你需要为字符串分配空间。

        char* stringArray[3]; 不提供指向动态大小字符串的指针。它提供了一个指向无处的字符串指针数组。使用malloc() 分配您的数组。 This answer 与您的要求接近,它解释了为字符串分配空间。

        【讨论】:

          【解决方案4】:

          您需要分配空间,并且要确保分配正确的空间量。请注意,一旦您的字符串长度超过预定值 100,接受的答案就容易溢出。动态计算事情并不难,最好的做法是避免静态大小的缓冲区(大部分时间)。例如:

          #include <stdio.h>
          #include <stdlib.h>
          
          void *
          xmalloc(size_t s)
          {
                  void *rv = malloc(s);
                  if( rv == NULL ) {
                          perror("malloc");
                          exit(EXIT_FAILURE);
                  }
                  return rv;
          }
          
          int
          main(void)
          {
                  char* stringArray[3];
                  for( int i = 0; i < 3; i++ ) {
                          char b;
                          int len = snprintf(&b, 1, "string%d", i) + 1;
                          stringArray[i] = xmalloc(len * sizeof *stringArray[i]);
                          snprintf(stringArray[i], len, "string%d", i);
                  }
                  for( int i = 0; i < 3; i++ ) {
                          printf( "%s\n", stringArray[i]);
                  }
                  return 0;
          }
          

          【讨论】:

          • 你确定那个 sizeof 吗?它应该是 sizeof *stringArray[i] 还是 sizeof(char)?否则,您将为字符串长度加 1 的字符指针分配内存。
          • @JustinOtto 你是对的。幸运的是,我们确实想要sizeof(char)(或只有 1 个),所以这个错误对我们有利。我试图证明x = xmalloc(n * sizeof *x) 成语并可怕地失败了。我会编辑。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-28
          • 2021-11-26
          • 1970-01-01
          • 1970-01-01
          • 2017-10-14
          • 2016-01-15
          相关资源
          最近更新 更多