J'écris un code qui utilise une fonction pour renvoyer un pointeur vers une structure, qui est allouée dynamiquement. Cependant, mon code ne lit pas les chaînes. Lorsque je l'exécute, il saute simplement la partie "Type name", je tape l'âge, et il affiche l'âge et rien pour le nom. Étrangement, le code fonctionne lorsque j'utilise scanf pour lire la chaîne, mais il ne l'a pas fait avec gets ou fgets. Quelqu'un pourrait-il m'aider? Merci d'avance.

#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
francescobfc 4 nov. 2019 à 01:53

1 réponse

Meilleure réponse

En effet, scanf laisse une nouvelle ligne dans le flux d'entrée. fgets l'obtient comme nom lors de son appel. Pour le prouver, changez:

scanf("%d", &n);

à quelque chose comme:

n = 1;

et vous ne verrez aucun problème.

Si vous ne souhaitez pas utiliser scanf, vous pouvez appeler fgets puis atoi/strtol.

char    *num;
fgets(num, 100, stdin);
n = atoi(num);
1
tpetert 4 nov. 2019 à 02:11