Как я могу вернуть массив символов из функции, используя malloc - PullRequest
1 голос
/ 22 сентября 2019

Я пытаюсь написать функцию, которая читает текстовый файл и помещает все слова этого текста в массив с динамическим размещением, чтобы этот массив не превышал размер.

Мне удалось написать рабочийфункция, которая создает массив с каждым словом (т.е. 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 голосов
/ 22 сентября 2019

Ваш массив является локальным, мы должны объявить его динамически.Пожалуйста, попробуйте ниже пример кода.

char **arr = NULL;
arr = (char**)malloc(words*sizeof(char*))
/* then use it */
return arr;
0 голосов
/ 22 сентября 2019

Спасибо всем за ответы!Мне удалось заставить его работать.

Я изменил тип возвращаемого значения функции на char** Я динамически распределял память для моего массива следующим образом: arr = (char **)malloc(words*sizeof(char));

, и затем он работал в моем основном, когдаЯ delcared char **arr = toArray("file.txt");

0 голосов
/ 22 сентября 2019

Ваш код:

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

В этом случае arr - это строка, а не массив строк!Следовательно, arr[0] это просто один символ, а не строка.И один символ в основном обрабатывается как int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...