Как исправить мой код, чтобы прочитать строку в функции, которая возвращает указатель на структуру - PullRequest
0 голосов
/ 04 ноября 2019

Я пишу код, который использует функцию для возврата указателя на структуру, которая выделяется динамически. Тем не менее, мой код не читает строки. Когда я запускаю его, он просто переходит на часть «Введите имя», я печатаю возраст и печатает возраст и ничего для имени. Странно, код работает, когда я использую scanf для чтения строки, но это не работает с get или fgets. Может ли кто-нибудь помочь мне? Заранее спасибо.

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

struct details
{
    char name[100];
    int age;
};

struct details * details_pointer(int n)
{
    struct details *pointer = (struct details *) malloc (n*sizeof(struct details));
    for (int i=0; i<n; i++)
    {
        printf("Student %d:\n", i);
        printf("name:\n");
        scanf("%s", pointer[i].name);
        //gets(pointer[i].name); not working
        //fgets(pointer[i].name, 100, stdin); not working
        printf("age:\n");
        scanf("%d", &pointer[i]. age);
    }
    return pointer;
}

int main()
{
    int n;
    printf("Type the number of persons:\n");
    scanf("%d", &n);
    struct details *student = details_pointer(n);
    for (int i=0; i<n; i++)
    {
        printf("\nName: %s", (*(student+i)).name);
        printf("Age: %d\n", (*(student+i)).age);
    }
    free(student);
    system("pause");
    return 0;
}

1 Ответ

1 голос
/ 04 ноября 2019

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

scanf("%d", &n);

на что-то вроде:

n = 1;

, и у вас не возникнет проблем.

Если вы не хотите использовать scanf, вы можете позвонить fgets, затем atoi/strtol.

char    *num;
fgets(num, 100, stdin);
n = atoi(num);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...