✂️ Le cours : le texte en C
En C, une « chaîne de caractères » est un simple tableau de char dont la fin est marquée par le caractère nul '\0' (de code 0). Toutes les fonctions de <string.h> cherchent ce '\0' pour savoir où le texte s'arrête. C'est simple et très rapide, mais fragile : si le '\0' manque, elles continuent à lire la mémoire bien au-delà de la chaîne.
Représentation en mémoire
char mot[] = "NSI";
indice : 0 1 2 3
+-------+-------+-------+-------+
| 'N' | 'S' | 'I' | '\0' |
+-------+-------+-------+-------+
code ASCII : 78 83 73 0
La taille du tableau doit prévoir la place du '\0' : "NSI" occupe 4 cases. Chaque lettre est un char, c'est-à-dire un petit entier : 'A' vaut 65, 'a' vaut 97, '0' vaut 48.
Parcourir une chaîne
On boucle jusqu'à rencontrer le '\0'. Pas besoin de connaître la longueur à l'avance.
#include <stdio.h>
int main(void) {
char texte[] = "programmation";
int voyelles = 0;
for (int i = 0; texte[i] != '\0'; i++) {
char c = texte[i];
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') {
voyelles++;
}
}
printf("%d voyelles\n", voyelles);
return 0;
}
Modifier une chaîne : tableau ou littéral ?
Attention à la différence entre deux écritures qui se ressemblent. char s[] = "NSI"; crée un tableau modifiable qui contient une copie du texte. char *s = "NSI"; crée un pointeur vers un littéral en lecture seule : le modifier est un comportement indéfini (plantage le plus souvent).
À éviter
char *s = "NSI";
s[0] = 'n'; /* littéral en lecture seule : plantage */
Correct
char s[] = "NSI";
s[0] = 'n'; /* copie modifiable : s vaut "nSI" */
Passer en majuscules avec ctype.h
<ctype.h> fournit toupper, tolower, isdigit, isalpha, isspace… qui travaillent caractère par caractère. Le cast (unsigned char) évite un comportement indéfini avec les caractères négatifs.
#include <stdio.h>
#include <ctype.h>
int main(void) {
char s[] = "nsi 2026";
for (int i = 0; s[i] != '\0'; i++) {
s[i] = toupper((unsigned char) s[i]);
}
printf("%s\n", s);
return 0;
}
Lire une chaîne au clavier
scanf("%s", mot) s'arrête au premier espace et ne limite pas la longueur lue : un texte trop long écrase la mémoire voisine. Préfère fgets(tableau, taille, stdin), qui lit une ligne entière (espaces compris) sans jamais dépasser la taille donnée. Elle conserve le retour à la ligne final, qu'on remplace par '\0'.
#include <stdio.h>
#include <string.h>
int main(void) {
char nom[30];
printf("Ton nom ? ");
fgets(nom, sizeof nom, stdin);
nom[strcspn(nom, "\n")] = '\0'; /* retire le retour à la ligne */
printf("Bonjour %s !\n", nom);
return 0;
}
Si tu tapes Lina MartinTon nom ? Lina Martin
Bonjour Lina Martin !
Construire une chaîne avec snprintf
snprintf fonctionne comme printf, mais écrit dans un tableau, en s'arrêtant avant de le dépasser. C'est la façon sûre d'assembler du texte et des nombres.
#include <stdio.h>
int main(void) {
char etiquette[32];
int note = 15, sur = 20;
snprintf(etiquette, sizeof etiquette, "Note : %d/%d", note, sur);
printf("%s\n", etiquette);
return 0;
}
Convertir une chaîne en nombre
atoi (entier) et atof (réel) de <stdlib.h> convertissent un texte en nombre. Elles ne signalent pas les erreurs : sur "abc", atoi renvoie simplement 0. Pour un contrôle strict, regarde strtol.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n = atoi("42") + 1;
double x = atof("3.5") * 2;
printf("%d %.1f\n", n, x);
return 0;
}