如何使用malloc从函数返回char数组

时间:2019-09-22 09:38:55

标签: c arrays malloc

我正在尝试编写一个函数,该函数读取文本文件并将此文本的每个单词放入具有动态分配的数组中,以使该数组不会过大。

我设法编写了一个工作函数,该函数创建了一个包含所有单词的数组(即arr [0] =“ bla”,arr [1] =“ bla”,...),但是我无法返回此数组,所以我可以在main()中使用它。

char* toArray(char *filename) {
  int words = countWords(filename); // this function returns the number of words in the file
  char *arr[words]; 
  int cur_size = 0;
  int i;

  FILE *file;
  file = fopen(filename, "r");

  for(int i = 0; i < words; i++) {
    fscanf(file, "%*s%n", &cur_size);
    arr[i] = malloc( (cur_size+1) * sizeof(char));
  }
  fclose(file);

  file = fopen(filename, "r");
  for (i = 0; i < words; i++) {
    fscanf(file, "%s", arr[i]);
    printf("%s\n", arr[i]);
  }
  fclose(file);

  return arr; // not sure if this is how i should return it
}


int main(int argc, char const *argv[]) {
  char *arr = toArray("file.txt");
  printf("%s", arr[0]); 

  return 0;
}

我希望

 printf("%s", arr[0]) 

打印文件的第一个单词。

但是我得到了这个错误: 格式为'%s'的参数应为'char *'类型,但参数2的类型为'int'[-Wformat =] printf(“%s \ n”,arr [0]);

我猜我在功能上犯了一个错误?

3 个答案:

答案 0 :(得分:0)

您的数组是局部的,我们需要动态声明它。请尝试下面的示例代码。

char **arr = NULL;
arr = (char**)malloc(words*sizeof(char*))
/* then use it */
return arr;

答案 1 :(得分:0)

谢谢大家的回答! 我设法使其正常工作。

我将函数返回类型更改为char** 我将内存动态分配给数组,如下所示: arr = (char **)malloc(words*sizeof(char));

然后当我代劳时它在我的主目录中起作用 char **arr = toArray("file.txt");

答案 2 :(得分:-1)

您的代码:

 char *arr = toArray("file.txt");

在这种情况下,arr是一个字符串,而不是字符串数组!因此,arr[0]只是一个字符,而不是字符串。单个字符基本上被视为一个整数。