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
|
#include <stdio.h>
#include <string.h>
/*-TC- Les globales, c'est pas bien du tout et ça ne se justifie
pas dans ton cas. Toute ces variables doivent être définies dans le
corps de la fonction main. C'est un habitude à prendre, et c'est
important */
char mot[20];
int i, j , l, ok, res;
/*-TC- main doit absolument retourner un entier de type int. C'est
la norme du langage C qui le dit. Par convention, on retourne la
valeur 0 ou EXIT_SUCCESS définie dans stdlib.h en d'exécution sans
problème. Ecrire: int main(void)*/
void main (void) {
printf("Tapez un mot:\n");
/*-TC- Cette utilisation de scanf engendre des problèmes si la chaîne
entrée par l'utilisateur est plus grande que l'espace mémoire alloué
à mot, et ainsi entraîner un débordement de tambon. DANGEREUX*/
scanf("%s",mot);
/*-TC- pratiquement, strlen retourne une valeur de type size_t*/
l=strlen(mot);
ok=0;
/* -TC- La forme de ton test est incorrecte, et est vrai seulement
lorsque j > 0. Le test correct ici (i < l) && (j >= 0). Par ailleurs,
il n'est pas recommandé d'appeler une variable "l" qui peux facilement
être confondue avec le chiffre 1. Note par ailleurs que la variable j
est inutile, car elle vaut l-i-1. */
for(i=0,j=l-1;i<l,j>0;i++,j--)
{
/*-TC- Ici, tu cherches à comparer des caractères et non des
chaînes de caractères. Il faut donc écrire
res = (mot[i] == mot[j]) qui vaudra 1 lorsque les deux
caractères sont égaux */
res = strcmp(&mot[i],&mot[j]);
/*-TC- Avec la comparaison de caractères, la condition devient
if (res != 1). Pourquoi ne pas intégrer ce test à la condition
de sortie de la boucle.*/
if(res!=0)
{
break;
}
else
{
ok++;
}
}
if(ok==l)
printf("PALINDROME\n");
else
printf("PAS PALINDROME\n");
/* -TC- TRES IMPORTANT: main doit retourner 0 ou EXIT_SUCCESS
i.e. return EXIT_SUCCESS*/
} |
Partager