Невозможно вернуть строку из пользовательского ввода в функции - PullRequest
0 голосов
/ 19 июня 2020

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

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

const char *userData();

int main() {

    char *name;
    userData();

    printf("\nName: %s", name);

}

const char *userData() {
    char *name;
    //INPUT FROM USER
    //NAME
    printf("\nEnter your name                 : ");
    fgets(name, 100, stdin);
    return name;

}

Ответы [ 3 ]

2 голосов
/ 19 июня 2020

В вашем коде есть две основные проблемы:

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.

  • Если у вас правильный компилятор, никогда не игнорируйте предупреждения компилятора.

1 голос
/ 19 июня 2020

Переменная name является локальной переменной в функции userData(), и ее область действия ограничена только этой функцией, поскольку две переменные различны, вы не получите ожидаемого результата.

Также вы должны выделить память для char *.

1 голос
/ 19 июня 2020

Значение, возвращаемое из userData, не присвоено ничему в вашей основной функции. Вы возвращаете * name из функции, но не сказали main, что делать с этим значением, которое оно возвращает. Эта переменная имени не используется совместно между функциями, если вы не сделаете ее глобальной, если вы полагались именно на это.

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