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