C:如何将字符串存储到“char * myArray [100]”数组中?

时间:2012-06-10 20:19:49

标签: c string

我在C中创建了这段代码,逐行读取文本文件,并将每一行存储到数组的位置:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

static const int MAX_NUMBER_OF_LINES = 100000;
static const char filename[] = "file.csv";

int main ( void )
{

  // Read file and fill the Array
  char *myArray[MAX_NUMBER_OF_LINES];
  int numberLine = 0;
  FILE *file = fopen (filename, "r");
  if (file != NULL)
  {
      char line [128];
      while (fgets (line, sizeof line, file) != NULL)
      {
          myArray[numberLine] = line;
          numberLine++;    
      }
      fclose (file);
  }

  // Print the Array
  for (int i = 0; i<numberLine; i++)
  {
    printf("%d|%s", i, myArray[i]);
  }
}

但是在打印数组时,它是空的。我做错了什么?

3 个答案:

答案 0 :(得分:4)

因为您需要将行复制到数组中的缓冲区中。

您需要为数组的每个元素中的字符串分配空间,然后使用strncpy之类的内容将每个line移动到每个myArray插槽中。

在您当前的代码中,您只是将相同的引用 - 您的line缓冲区复制到每个数组插槽中,因此最后,myArray的每个插槽应指向相同的字符串在记忆中。

根据Shoaib的建议,如果可用,strdup将保存一步,请尝试:

myArray[i] = strdup(line);

此处没有错误处理,请参阅strncpystrdup的文档。

或者,您只需向myArray添加维度:

char myArray[MAX_NUMBER_OF_LINES][100];

答案 1 :(得分:1)

您需要为所有字符串分配空间,但不仅仅是指向不存在的字符串的指针。在您的示例中,所有已分配的指针都指向变量,这超出了范围。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

static const int MAX_NUMBER_OF_LINES = 100000;
static const int MAX_LINE_LENGTH = 127;
static const char filename[] = "file.csv";

int main ( void )
{

  // Read file and fill the Array
  char myArray[MAX_NUMBER_OF_LINES][MAX_LINE_LENGTH + 1 /* for 0 byte at end of string */];
  int numberLine = 0;
  FILE *file = fopen (filename, "r");
  if (file != NULL)
  {
      while (fgets (myArray[numberLine], MAX_LINE_LENGTH + 1, file) != NULL)
      {
          numberLine++;    
      }
      fclose (file);
  }

  // Print the Array
  for (int i = 0; i<numberLine; i++)
  {
    printf("%d|%s", i, myArray[i]);
  }
}

答案 2 :(得分:1)

char *数组指向行chararray,但是你应该在数组中保存每一行并将myArray [numberLine]指向它:


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

static const int MAX_NUMBER_OF_LINES = 100000;
static const char filename[] = "file.csv";

int main ( void )
{

  // Read file and fill the Array
  char *myArray[MAX_NUMBER_OF_LINES];
  int numberLine = 0;
  FILE *file = fopen (filename, "r");
  if (file != NULL)
  {
      char line [128];
      while (fgets (line, sizeof line, file) != NULL)
      {
          //refinement is hre
          myArray[numberLine] = (char*)malloc(sizeof line);
          strcpy(myArray[numberLine], line);
          numberLine++;    
      }
      fclose (file);
  }

  // Print the Array
  for (int i = 0; i<numberLine; i++)
  {
    printf("%d|%s", i, myArray[i]);
    free(myArray[i])

  }
}