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
| #include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
unsigned short nombre(FILE *f) { // retourne le nombre de mots dans un fichier
int a=0;
unsigned short i=0;
long pos=ftell(f);
fseek(f, 0, SEEK_SET);
do {
a=fgetc(f);
if (isspace(a)) {
i++;
}
} while (a != EOF);
fseek(f, pos, SEEK_SET);
return i;
}
unsigned short palindrome(char ch[]) {//retourne 1 si le mot est palindrome 0 sinon
int n=strlen(ch);
for (int i=0; i < (n/2); i++) /* On passera sur ce n/2 qui est calculé à chaque itération... */{
if (ch[i] != ch[n-i-1]) return 0;
}
return 1;
}
int main() {
int c=0;
FILE *f1=NULL;
FILE *f2=NULL;
f1=fopen("mots.txt", "r");
f2=fopen("palindrome.txt", "a+");
if (f1 == NULL || f2 == NULL) {
printf("erreur d'ouverture");
if (f1) fclose(f1);
if (f2) fclose(f2);
return -1;
}
do {
int j=0;
do { //cette boucle permet de déterminer la longeur de chaqu'un des mots du fichier
c=fgetc(f1);
j++;
} while (isalpha(c));
fseek(f1, -j, SEEK_CUR);//Pour faire retourner le cursor vers le début du mot qui précede le 1er espace ou retour à la ligne rencontré.
char *T=malloc(j * sizeof (*T));
for (int i=0; i < j; i++) {//mettre le mot trouvé dans un tableau et remettre le cursor à la position avec laquelle il a quitté la boucle do
T[i]=fgetc(f1);
printf("T[%d]=%c\n", i, T[i]);
}
T[j-1]='\0';
printf("T=%s\n", T);
if (palindrome(T) != 0) {
fprintf(f2, "%s ", T);
}
free(T);
} while (c != EOF);
printf("Le nombre des mots palindromes est : %d\n ", nombre(f2));
fclose(f1);
fclose(f2);
return 0;
} |
Partager