В вашем коде есть две основные проблемы:
1.
name
in main()
- это просто указатель.
Где вы хотите сохранить строку?
Вам нужно либо создать name
как массив char
, либо при использовании name
в качестве указателя динамически распределять память через функция управления памятью, например malloc()
, на которую указывает указатель.
2.
Как передать указатель от main()
вызывающему? Фактический список параметров userData
пуст, это означает, что ничего не передается.
Вам нужно поместить char *name;
в userData
в список параметров:
char *userData (char* name) {
и вызвать userData
как:
userData(name);
Примечание: этот name
теперь указывает идентификатор указателя / буфера в main()
, а не указатель в userData()
. Тот факт, что указатель / буфер в вызывающий main()
, а также указатель в userData()
имеют одно и то же имя - плохое совпадение для демонстрации примера. Но я думаю, вы поймете, как это работает.
#include <stdio.h>
#include <stdlib.h>
#define BUFLEN 20
char * userData (char* name, size_t len);
int main (void) {
char* name = malloc (sizeof(char) * BUFLEN);
if (!name)
{
fputs("Memory allocation for name failed!", stderr);
return 1;
}
if (!userData(name, sizeof(char) * BUFLEN))
{
fputs("Error at string input!", stderr);
return 1;
}
printf("\nName: %s", name);
}
char * userData (char *name, size_t len) {
printf("\nEnter your name: ");
if (!fgets(name, len, stdin))
{
return NULL;
}
return name;
}
Примечания:
Тип возврата userData
не обязательно должен соответствовать const
. Никакого эффекта. Функция возвращает указатель на char
. const
ness не имеет никакого эффекта, поскольку он не влияет на то, доступно ли возвращаемое значение адреса в вызывающей стороне или нет.
Во-первых, в C это невозможно для передачи или возврата строк в или из функций по значению .
Во-вторых, в C нет типа с названием « строка ». Строки хранятся в модифицируемых или неизменяемых массивах char
s.
Таким образом, выражение «возврат строки» неверно в двух контекстах. Вместо этого вы передаете или возвращаете ссылку в массивы, содержащие строки, используя указатели.
Обновите или замените свой компилятор. Он ваша рука помощи в обнаружении синтаксических ошибок в вашем коде. Например, следует отметить G CC или Clang.
Если у вас правильный компилятор, никогда не игнорируйте предупреждения компилятора.