1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
| #include <stdio.h>
#include <string.h>
#define NMAX 20
struct personne {
char nom[20];
char num[20];
};
/**
* -TC- Vide le tampon du flux d'entrée standard.
*/
static void vider_stdin(void)
{
scanf("%*[^\n]");
getchar();
}
/**
* -TC- Saisit un chaîne de caractère entrée par l'utilisateur de manière
* sécurisée.
*
* Si la chaîne entrée par l'utilisateur est trop longue pour être contenue
* le tampon prévu à cet effet, un message d'erreur est affiché, et
* l'utilisateur est invité à répéter sa saisie.
*
* @param s_tampon Tampon destiné à recevoir la chaîne de l'utilisateur.
* @param taille Taille du tampon.
* @param s_message Invite à afficher à l'utilisateur.
*/
static void saisie_chaine_stdin(char *s_tampon,
size_t taille,
char const *s_message)
{
int saisie_ok = 0;
char *pc = NULL;
while (saisie_ok != 1)
{
/* -TC- On affiche le message à l'utilisateur */
printf("%s ", s_message);
fflush(stdout);
/*-TC- Saisie de la chaîne */
fgets(s_tampon, taille, stdin);
if ((pc = strchr(s_tampon, '\n')) != NULL) /* -TC- saisie OK */
{
saisie_ok = 1;
*pc = '\0';
}
else /* -TC-La chaîne de l'utilisateur a été tronquée */
{
/*-TC- Si la chaine est trop longue, on affiche un message
d'erreur, on vide le tampon et on recommence */
fprintf(stderr, "Votre entrée est trop longue! Réessayez..\n");
vider_stdin();
}
}
}
void saisie(struct personne perso[], int nombre)
{
int i;
for (i = 0; i < nombre; i++) {
saisie_chaine_stdin(perso[i].nom, sizeof perso[i].nom,
"entrez le nom = ");
saisie_chaine_stdin(perso[i].num, sizeof perso[i].num,
"entrez le num = ");
}
}
void affiche(struct personne perso[], int nombre)
{
int i;
for (i = 0; i < nombre; i++) {
printf("%s de numero %s\n", perso[i].nom, perso[i].num);
}
}
int main(void)
{
struct personne perso[NMAX];
int nombre;
int rc;
printf("entrez le nombre (entre 0 et %d): ", NMAX);
/* On force l'écriture sur stdout */
fflush(stdout);
/* -TC- sécurisons un peu la saisie avec scanf() */
while ((rc = scanf("%d", &nombre)) != 1 || nombre < 0 || nombre > NMAX)
{
/*-TC- La saisie a échoué: on vide la tampon et on recommence */
vider_stdin();
printf("entrez le nombre (entre 0 et %d): ", NMAX);
fflush(stdout);
}
/*-TC- Ici, il reste au minimum '\n' sur le tampon de stdin. On purge cela*/
vider_stdin();
saisie(perso, nombre);
affiche(perso, nombre);
return 0;
} |
Partager