如何在C中用字符串填充数组?

时间:2010-02-20 00:48:35

标签: c

我正在尝试使用文件中的名称填充数组:

Andrew
Andy
Bob
Dan
Derek
Joe
Pete
Richy
Steve
Tyler

这是我写的函数......但是当我运行它时程序崩溃了:

#include <stdio.h>

main(){
  int i=0, size=10;
  char fname[15];
  char** data;
  char* name;
  FILE* fp;

  printf("Enter a filename to read names:\n");
  scanf("%s", fname);

  fp = fopen(fname, "r");
  if(fp == NULL)
    exit();

  data = (char**)malloc(sizeof(char**)*size);

  while(!feof(fp)){
    fscanf(fp, "%s", name);
    data[i] = (char*)malloc(sizeof(name));
    data[i] = name;
    i++;
  }

  fclose(fp);

  printf("\n\n");

  for(i=0; i<size; i++)
    printf("%s ", data[i]);

  free(data);
}

任何人都知道我做错了什么? 感谢

3 个答案:

答案 0 :(得分:5)

您永远不会为名称分配空间。但你把东西放在这一行:

 fscanf(fp, "%s", name);

变化

 char name[100];

fscanf(fp, "%99s", name);

你也应该将输入限制为文件名:

scanf("%14s", fname);

你也永远不会为数组中的每个元素释放数据,如果这是一个较大系统中的子程序,它就会有内存泄漏。

答案 1 :(得分:5)

这里有几个错误:

1)你永远不会分配存储name的内存。你可以通过使用:

来解决这个问题
char name[128];

然后,当您使用fscanf时,您将拥有:

fscanf(fp, "%127s", name); // stores this in name correctly, now...

2)你不恰当地为data[i]分配空间:

data[i] = (char*)malloc(sizeof(name));

这将分配空间来保存一个指向char char*)的指针,因为name是char*。你需要这样做:

data[i] = (char*)malloc(sizeof(char) * (strlen(name) + 1 ) );

这将为数据和单个终止字符分配足够的空间。

3)您没有正确分配data[i]。您不能在此处使用=,而是需要使用strcpy

strcpy(data[i], name);

4)你没有释放data[..]元素中的单个指针。你应该在printf之后添加一个免费的:

for(i=0; i<size; i++)
{
    printf("%s ", data[i]);
    free(data[i]);  // Free each pointer you allocate
}

每个malloc来电最终应该有一个匹配的free来电。

答案 2 :(得分:0)

有很多问题。其他答案谈论名称没有被初始化,所以我不会重复。

第二个问题是您没有正确处理EOF。只有在您尝试阅读文件末尾时,feof才会返回true。所以你会得到一个空的第11个名字。

最后一个问题是数据数组只能容纳10个名字。由于第二个问题,你将使用空白的第11个名称溢出缓冲区。此外,您的代码取决于输入文件的详细信息 - 为其提供具有更多名称的不同输入文件,即使在修复问题2后您仍然会崩溃。