Как код может вернуть массив символов в C? - PullRequest
0 голосов
/ 11 апреля 2020

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

#include <stdio.h>
#include <cstring>

int function() {
  char word[100];
  scanf("%s", &word);
  return word;
}

int main() {
  char word2[100] = function();
}

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

В вашем коде, int function(), возвращаемое значение этой функции - int, но вы хотите получить строку, поэтому используйте char * function().

И, scanf("%s",&word); не используйте & для массива символов.

Пример для вашего кода:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char * function () {
    char * word = malloc(sizeof(64));
    if (!word)
       return NULL;
    scanf("%s",word);
    return word;
}
int main () {
    char * word2 = function();
    printf("%s\n", word2);
    free(word2);
    return 0;
}
0 голосов
/ 11 апреля 2020

Итак, основная проблема в том, что функции не могут возвращать типы массивов, и вы не можете копировать содержимое одного массива в другой, используя оператор =. Массивы в C отличаются от других типов.

За исключением случаев, когда это операнд операторов sizeof или унарный & или строковый литерал, используемый для инициализации массива символов в объявлении, выражение типа «массив N-элементов из T» преобразуется («распадается») в выражение типа «указатель на T» и значение выражения это адрес первого элемента. Поэтому, когда вы пишете

return word;  

, это интерпретируется как

return &word[0];  // return char *

Поскольку word является локальным для функции, он перестает существовать , когда function выходит Таким образом, вы возвращаете неверный указатель.

Есть три способа обойти это:

Объявить word как static:

char *function( void )
{
  static char word[100];

  scanf( "%s", word ); // no & operator here
  return word; // return char *
}

Объявление массива как static означает, что он существует в течение всего времени жизни программы, а не только этой функции. Это работает, но ограничивает полезность функции и не рекомендуется.

Динамическое выделение массива:

char *function( void )
{
  char *word = malloc( sizeof *word * 100 );

  scanf( "%s", word ); // again, no & operator
  return word;
}

Это лучше, чем делать массив static, но теперь вы должны убедиться, что вы free массив, когда вы закончите с ним.

Передать массив назначения в качестве аргумента функции:

void function( char *word, size_t size )
{
  scanf( "%s", word );
  return word;
}

Это мой предпочтительный метод, но в данном конкретном случае вы могли бы просто вызвать scanf напрямую.

Так что это касается стороны функции, давайте рассмотрим сторону вызывающего.

Единственными действительными инициализаторами для объявления массива являются либо заключенная в скобки последовательность значений:

 char word[100] = {'H', 'e', 'l', 'l', 'o', 0 };

или, в случае символьных массивов, строка в кавычках:

 char word[100] = "Hello";

Вы не можете инициализировать массив в объявлении с результатом функции, потому что функция не может возвращать типы массивов.

Чтобы скопировать содержимое одного массива в другой, вам необходимо использовать либо strcpy (для строк, которые являются массивами char с завершающим 0) или memcpy (для всех других типов массивов), и вы не можете сделать это в объявлении.

Если все, что вам нужно сделать, это прочитать слово в массив, просто обойти function и вызвать scanf напрямую:

int main( void )
{
  char word[100];

  scanf( “%s”, word );
  // do stuff with word
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...