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 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);
Questions connexes
Questions liées
De nouvelles questions
c
C est un langage de programmation à usage général utilisé pour la programmation système (OS et embarqué), les bibliothèques, les jeux et les plateformes multiples. Cette balise doit être utilisée avec des questions générales concernant le langage C, tel que défini dans la norme ISO 9899 (la dernière version, 9899: 2018, sauf indication contraire - également balise les demandes spécifiques à la version avec c89, c99, c11, etc.). C est distinct de C ++ et il ne doit pas être combiné avec la balise C ++ en l'absence d'une raison rationnelle.