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 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
| #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BIBLIO_MAX_LIVRES 50
struct bibl
{
char titre[50];
char auteur[50];
int prix;
};
/* -tc- purge les caracteres restant dans le tampon du flux entrant fp */
static void fpurge(FILE *fp)
{
if (fp != NULL)
{
int c;
while ((c = fgetc(fp)) != '\n' && c != EOF)
{
}
}
}
/* -tc- elimine le caractere de fin de ligne saisi par fgets() et fait le
menage sur le flux entrant si necessaire */
static void fclean(char *tampon, FILE *fp)
{
if (tampon != NULL && fp != NULL)
{
char *pc = strchr(tampon, '\n');
if (pc != NULL)
{
*pc = 0;
}
else
{
fpurge(fp);
}
}
}
static void remplir(struct bibl *t, size_t n, size_t taille)
{
/* -tc- on commence par valider les arguments*/
if (t != NULL)
{
size_t i;
char tampon[16] = {0};
char *pend = NULL;
if (n > taille)
{
n = taille;
}
for (i = 0; i < n; i++)
{
/* -tc- Il est possible de factoriser encore un peu le code au
niveau des saisies securisees */
printf("Entrer le titre du livre: ");
fflush(stdout);
if (fgets(t[i].titre, sizeof t[i].titre, stdin) != NULL)
{
fclean(t[i].titre, stdin);
}
printf("Enter le nom de l'auteur du livre: ");
fflush(stdout);
if (fgets(t[i].auteur, sizeof t[i].auteur, stdin) != NULL)
{
fclean(t[i].auteur, stdin);
}
do
{
printf("Entrer le prix du livre: ");
fflush(stdout);
if (fgets(tampon, sizeof tampon, stdin) != NULL)
{
fclean(tampon, stdin);
}
t[i].prix = strtol(tampon, &pend, 0);
}
while (*pend != 0);
}
}
}
static void afficher(struct bibl * t, size_t n, size_t taille)
{
if (t != NULL && n < taille)
{
size_t i;
if (n > taille)
{
n = taille;
}
for (i = 0; i < n; i++)
{
printf("%s\n", t[i].titre);
}
}
}
/* -tc- main() retourne un entier de type int, toujours! */
int main(void)
{
struct bibl t[BIBLIO_MAX_LIVRES];
int n;
int rv; /* -tc- valeur retournee par scanf() */
/* -tc- securisons un peu la saisie */
do
{
printf("Entrer le nombre de livres: ");
/* -tc- pour etre portable, il faut forcer l'affichage avec fflush() */
fflush(stdout);
rv = scanf("%d",&n);
/* -tc- pour faire les choses proprement, on purge les caracteres qui
se trouvent encore sur le flux d'entree standard */
fpurge(stdin);
}
while (rv != 1 || n < 0);
remplir(t, n, BIBLIO_MAX_LIVRES);
afficher(t, n, BIBLIO_MAX_LIVRES);
/* -tc- 0, EXIT_SUCCESS et EXIT_FAILURE sont les 3 valeurs portables
que peut retourner main() */
return 0;
} |
Partager