在C中存储char指针数组

时间:2014-09-09 19:10:46

标签: c pointers

我试图读取文本文件并使用C函数将其存储在数组中,但遇到指针困难:

要读取的文件格式为\ t:

France Baguette

中国大米

日本寿司

我的代码如下,但目前只显示文件中的最后一个条目:

void func(char *a[])
{
     FILE *dic = fopen("dic.log", "r");
     char *country = malloc(30);
     char *food = malloc(30);
     int i = 0;
     while (fscanf(dic, "%s %s", country, food) == 2)
     {
          a[i] = country;
          a[i+1] = food;
          i+=2;
     }
     fclose(dic);
}

int main (int argc, char*argv)
{
     char *b[6];
     func(b);

     printf("%s %s\n", b[0], b[1]);
     printf("%s %s\n", b[2], b[3]);

     return 1;
 }

我希望函数能够填充数组' b'以下列方式:

B [法国,面包,中国,水稻,日本,寿司]

2 个答案:

答案 0 :(得分:4)

每次阅读都需要malloc。目前,每次新读取时,您都会覆盖相同的内存(在开头时使用了malloced)。 试试这个:

 while (fscanf(dic, "%s %s", country, food) == 2)
 {
      a[i] = country;
      a[i+1] = food;
      i+=2;

      // Reassign so we can re-read
      country = malloc(30);
      food = malloc(30);
 }

这不是一个非常优雅的解决方案,因为你需要在最后一次阅读后释放最后的mallocs - 但它证明了这一点!

答案 1 :(得分:0)

这是有发生的,因为您只将内存分配给countryfood一次。

在while循环中使用malloc,它将分配两个内存来单独存储值。

您的代码有点像

void func(char *a[])
{
     FILE *dic = fopen("dic.log", "r");
     char *country;
     char *food;
     int i = 0;
     while (!feof(dic))
     {
          country = (char*)malloc(30);
          food = (char*)malloc(30);
          fscanf(dic, "%s%s", country, food);
          a[i] = country;
          a[i+1] = food;
          i+=2;
     }
     fclose(dic);
}

int main (int argc, char*argv)
{
     char *b[6];
     func(b);

     printf("%s %s\n", b[0], b[1]);
     printf("%s %s\n", b[2], b[3]);

     return 1;
 }