Caractère par caractère : ctype.h
Tester et transformer des caractères : lettres, chiffres, majuscules, minuscules.
Ce que tu vas apprendre
- Tester la nature d'un caractère avec
isalpha,isdigit,isspace… - Changer la casse avec
toupperettolower - Compter des lettres avec un tableau de 26 compteurs
Les fonctions de ctype.h
#include <ctype.h> fournit des fonctions qui renvoient « vrai » (une valeur non nulle) ou 0 :
isalpha(c): une lettreisdigit(c): un chiffreisupper(c)/islower(c): majuscule / minusculeisspace(c): espace, tabulation, retour à la ligne
toupper(c) et tolower(c) renvoient le caractère converti ; ils ne modifient pas c. Écris s[i] = toupper(s[i]);.
Par prudence, on passe le caractère sous la forme (unsigned char) c à ces fonctions.
Les lettres comme indices
Les lettres minuscules ont des codes qui se suivent : c - 'a' vaut 0 pour a, 1 pour b… jusqu'à 25 pour z. On s'en sert pour compter les lettres dans un tableau int compte[26] = {0};.
Les exercices n'utilisent que des lettres sans accent : en UTF-8, une lettre accentuée occupe plusieurs octets et ne serait pas reconnue par ces fonctions.
Exemples commentés
1.Lettres et chiffres
#include <stdio.h>
#include <ctype.h>
int main(void) {
char s[200];
if (fgets(s, sizeof s, stdin) == NULL) {
return 0;
}
int lettres = 0, chiffres = 0;
for (int i = 0; s[i] != '\0'; i++) {
unsigned char c = (unsigned char) s[i];
if (isalpha(c)) {
lettres++;
} else if (isdigit(c)) {
chiffres++;
}
}
printf("lettres: %d\nchiffres: %d\n", lettres, chiffres);
return 0;
}Entrée
R2D2 et C3PO
Sortie
lettres: 7 chiffres: 3
Les espaces et le retour à la ligne ne sont ni des lettres ni des chiffres : ils ne sont pas comptés.
2.Rang de chaque lettre
#include <stdio.h>
#include <ctype.h>
int main(void) {
char mot[100];
scanf("%99s", mot);
for (int i = 0; mot[i] != '\0'; i++) {
char c = (char) tolower((unsigned char) mot[i]);
printf(i > 0 ? " %d" : "%d", c - 'a' + 1); // a=1, b=2...
}
printf("\n");
return 0;
}Entrée
Cab
Sortie
3 1 2
On met d'abord la lettre en minuscule, puis c - 'a' + 1 donne sa position dans l'alphabet.
Chaque exemple est compilé et exécuté automatiquement pour garantir la sortie affichée.
Erreurs fréquentes
Croire que toupper modifie la variable
À éviter
toupper(s[i]);
À préférer
s[i] = (char) toupper((unsigned char) s[i]);
toupper renvoie un résultat : sans affectation, il est perdu.
Compter avec un tableau non initialisé
À éviter
int compte[26];
À préférer
int compte[26] = {0};Sans initialisation, les compteurs partent de valeurs quelconques.
Entraîne-toi
5 questions variées pour fixer la leçon : choix, résultat à prévoir, ligne à compléter, code à remettre dans l'ordre, erreur à trouver.
À toi de jouer !
12 exercices pour mettre cette leçon en pratique, du plus simple au plus avancé.