Bonjour,
Dans le cadre du cours sur le C, il y a un exercice qui demande de vérifier si un mot est oui ou non un palindrome. Pour pousser l’exercice plus loin, j’ai essayé de faire fonctionner la fonction avec toutes les chaînes de caractères possibles, et pour cela, je dois entre autres ne pas tenir compte des accents, des majuscules, des trémas, etc..
J’ai donc écrit une fonction pour changer une chaîne de caractères fournie de façon à ce que les accents et autres soient supprimés :
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 | char norm_char(char c){ if(c >= 65 && c <= 90) return tolower(c); else if(c == 129 || c == 150 || c == 151 || c == 154 || c = 163) return 'u'; else if(c == 131 || c == 132 || c == 133 || c == 134 || c == 142 || c = 143 || c == 160 || c == 166) return 'a'; else if(c == 130 || c == 136 || c == 137 || c == 138 || c == 144) return 'e'; else if(c == 128 || c == 135) return 'c'; else if(c == 139 || c == 140 || c == 141 || c == 161) return 'i'; else if(c == 147 || c == 148 || c == 149 || c == 153 || c == 162 || c == 167) return 'o'; else if(c == 152) return 'y'; else if(c == 164 || c == 165) return 'n'; return c; } int to_norm(char * str, size_t size){ int i; unsigned int char_changed = 0; for(i = 0; i < size -1; i++){ if(str[i] != norm_char(str[i])){ str[i] = norm_char(str[i]); char_changed++; } } return char_changed; } |
Mais pour écrire la seconde, je me suis dit que ça serait plus simple si je changeais la première de façon à recevoir directement l’information ’le caractère a été changé’. J’ai donc écrit une autre fonction :
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 | int norm_char(char *c){ if(*c >= 65 && *c <= 90) *c = tolower(*c); else if(*c == 129 || *c == 150 || *c == 151 || *c == 154 || *c == 163) *c = 'u'; else if(*c == 131 || *c == 132 || *c == 133 || *c == 134 || *c == 142 || *c == 143 || *c == 160 || *c == 166) *c = 'a'; else if(*c == 130 || *c == 136 || *c == 137 || *c == 138 || *c == 144) *c = 'e'; else if(*c == 128 || *c == 135) *c = 'c'; else if(*c == 139 || *c == 140 || *c == 141 || *c == 161) *c = 'i'; else if(*c == 147 || *c == 148 || *c == 149 || *c == 153 || *c == 162 || *c == 167) *c = 'o'; else if(*c == 152) *c = 'y'; else if(*c == 164 || *c == 165) *c = 'n'; else return 0; return 1; } int to_norm(char * str, size_t size){ int i; unsigned int char_changed = 0; for(i = 0; i < size -1; i++){ if(norm_char(&str[i])) char_changed++; } return char_changed; } |
Mais je me pose la question : Y en a t-il une ’mieux’, et pourquoi ?