Dynami c выделение массива структур не работает - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь динамически выделить массив структур, но каждый раз, когда я читаю данные структуры, она печатает некоторые случайные символы перед оператором печати. Например, если ввести JOHN в качестве имени, он будет печатать JO перед оператором print, а иногда пропускает некоторые выражения scanf. Вот код:

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

int main()
{
    struct DEP
    {
        char name[30];
        char rank;
        int number;

    };
    struct DEP *members;
    int size, i;

    scanf("%d", &size);
    members = malloc(size * sizeof(struct DEP));
    if(members == NULL)
    {
        return 1;
    }

    for(i = 0;i < size;i++)
    {
        fgets(members[i].name, 30, stdin);
        members[i].name[strcspn(members[i].name, "\n")] = '\0';
        scanf("%c %d", &members[i].rank, &members[i].number);
        printf("%s\n%c\n%d\n", members[i].name, members[i].rank, members[i].number);
    }


    return 0;
}

И пример ввода:

1 Ответ

1 голос
/ 09 января 2020

Извините, но я добавил несколько операторов print в ваш код во время работы на моем конце.

Я сделал следующее, чтобы избавиться от '\ n', оставшегося в буфере после scanf; и это дало мне хороший результат. Это то, что является root проблемы, я считаю. Нечистый буфер.

int c;
while ((c=getchar()) != '\n' && c != EOF);

Изменена программа, как показано ниже.

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

int main()
{
    struct DEP
    {
        char name[30];
        char rank;
        int number;

    };
    struct DEP *members;
    int size, i, c;

    scanf("%d", &size);
    members = malloc(size * sizeof(struct DEP));
    if(members == NULL)
    {
        return 1;
    }

    while ((c = getchar()) != '\n' && c != EOF);
    for(i = 0;i < size;i++)
    {
        printf ("Enter Name: \n");
        fgets(members[i].name, 30, stdin);
        members[i].name[strcspn(members[i].name, "\n")] = '\0';
        printf ("Enter rank and number: ");
        scanf("%c %d", &members[i].rank, &members[i].number);
        while ((c = getchar()) != '\n' && c != EOF);
        printf("Name: %s\nRank: %c\nNum: %d\n", members[i].name, members[i].rank, members[i].number);
    }


    return 0;
}

Получен следующий вывод -

$ ./main.out
3
Enter Name:
siddharth
Enter rank and number: z 5
Name: siddharth
Rank: z
Num: 5
Enter Name:
sid
Enter rank and number: s 6
Name: sid
Rank: s
Num: 6
Enter Name:
sidhh
Enter rank and number: e 8
Name: sidhh
Rank: e
Num: 8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...