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
| /* L'inclusion de conio.h n'est pas portable et absolument inutile ici. Idem
pour dos.h.
#include<conio.h>
#include<dos.h>
*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define TAILLE_MOTS 100
#define N_MOTS 2
/* -tc- elimine le caratere de fin de ligne saisi par fgets() et fait le menage
sur le flux entrant en cas de saisie tronquee */
void fclean(char *buffer, FILE *fp)
{
char *pc =strchr(buffer, '\n');
if (pc != NULL)
{
*pc = 0;
}
else
{
int c;
while ((c = fgetc(fp)) != '\n' && c != EOF)
{
}
}
}
/* -tc- il est recommande de declarer une fonction a l'aide d'un prototype
i.e. une fonctions sans parametres est specifiee a l'aide de void. Par
ailleurs, ta fonction input() est responsable de la saisie et de l'affichage.
Ce n'est pas terrible du point de vue de la cohesion */
int input(void)
{
char *t[N_MOTS];
int i;
int err = 0;
/* -tc- on prevoit de sortir de la boucle en cas d'erreur */
for (i = 0; err == 0 && i < N_MOTS; i++)
{
/* -tc- il est deconseille de caster la valeur retournee par malloc().
Par ailleurs, sizeof (char) vaut 1 par definition -> inutile! */
t[i] = malloc(sizeof *t[i] * TAILLE_MOTS);
/* -tc- il faut TOUJOURS verifier que l'allocation a reaussi! */
if (t[i] != NULL)
{
printf("mot: ");
/* -tc- "mot: " ne se terminant pas par un caractere de fin de
ligne, il est necessaire de forcer l'affichage avec fflush() */
fflush(stdout);
fgets(t[i], TAILLE_MOTS, stdin);
/* -tc- on fait le menage sur stdin */
fclean(t[i], stdin);
}
else
{
/* -tc- erreur d'allocation: on fait le menage et on sort de la
boucle */
while (i > 0)
{
i--;
free(t[i]), t[i] = NULL;
}
err = 1;
}
}
/* -tc- on affiche et on fait le menage en une passe */
for (i = 0; err == 0 && i < N_MOTS; i++)
{
printf("le %d%s mot est %s\n", i + 1, (i > 0) ? "eme" : "er", t[N_MOTS-i-1]);
free(t[i]), t[i] = NULL;
}
/* -tc- on retourne une valeur permettant de savoir si une erreur a eu lieu */
return err;
/* -tc- L'appel a getch() est inutile!
getch();
*/
}
int main(void)
{
int err = 0;
int ret = EXIT_SUCCESS;
err = input();
if (err != 0)
{
ret = EXIT_FAILURE;
}
return ret;
} |
Partager