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

And*_*rew 3 c

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

Andrew
Andy
Bob
Dan
Derek
Joe
Pete
Richy
Steve
Tyler
Run Code Online (Sandbox Code Playgroud)

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

#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);
}
Run Code Online (Sandbox Code Playgroud)

谁知道我做错了什么?谢谢

Hog*_*gan 5

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

 fscanf(fp, "%s", name);
Run Code Online (Sandbox Code Playgroud)

更改

 char name[100];
Run Code Online (Sandbox Code Playgroud)

fscanf(fp, "%99s", name);
Run Code Online (Sandbox Code Playgroud)

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

scanf("%14s", fname);
Run Code Online (Sandbox Code Playgroud)

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


Ree*_*sey 5

你有几个错误:

1)你永远不会分配name将被存储的内存.您只需使用以下方法即可解决此问题:

char name[128];
Run Code Online (Sandbox Code Playgroud)

然后,当你使用fscanf时,你会有:

fscanf(fp, "%127s", name); // stores this in name correctly, now...
Run Code Online (Sandbox Code Playgroud)

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

data[i] = (char*)malloc(sizeof(name));
Run Code Online (Sandbox Code Playgroud)

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

data[i] = (char*)malloc(sizeof(char) * (strlen(name) + 1 ) );
Run Code Online (Sandbox Code Playgroud)

这将为数据分配足够的空间以及单个终止字符.

3)您没有data[i]正确分配.你不能只=在这里使用,但需要使用strcpy:

strcpy(data[i], name);
Run Code Online (Sandbox Code Playgroud)

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

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

每个malloc电话最终应该有一个匹配的free电话.