Le C, en tant que langage, est minuscule - types, opérateurs, flux de contrôle, fonctions, pointeurs. Il ne peut ni afficher, ni lire un fichier, ni comparer une chaîne, ni allouer de la mémoire. Tout cela, c'est la bibliothèque standard : un ensemble d'en-têtes que toute implémentation conforme livre.
Cette page est une carte. Chaque section dit à quoi sert un en-tête, montre un court exemple fonctionnel, et pointe vers la page plus complète quand elle existe.
stdio.h - l'entrée et la sortie
L'en-tête que vous incluez en premier dans presque tout programme. Il contient printf et scanf, le type FILE et les fonctions de fichiers, et les fonctions d'entrée orientées ligne, plus sûres.
L'essentiel : printf, fprintf, sprintf, snprintf pour la sortie ; scanf, fscanf, sscanf, fgets, getchar pour l'entrée ; fopen, fclose, fread, fwrite, fseek pour les fichiers. Une couverture plus approfondie se trouve dans printf, scanf et les fichiers.
Une règle à emporter : n'utilisez jamais gets(). Elle n'a aucun moyen de connaître la taille de votre tampon et a été retirée de la norme en C11. fgets(buf, sizeof buf, stdin) en est le remplacement.
stdlib.h - les utilitaires généraux
Le fourre-tout : mémoire, conversions, aléa, contrôle du processus, tri.
À retenir : malloc, calloc, realloc, free (voir mémoire dynamique) ; atoi, atof, strtol, strtod pour les conversions - préférez la famille strto*, qui peut signaler l'échec là où atoi renvoie silencieusement 0 ; rand et srand (voir nombres aléatoires) ; exit, abort, getenv, system ; et qsort/bsearch.
string.h - chaînes et blocs de mémoire
Les chaînes C sont des tableaux de char se terminant par '\0', et chaque opération sur elles est un appel de fonction.
Deux habitudes empêchent cet en-tête de devenir une source de débordements de tampon : connaissez toujours la taille de la destination, et rappelez-vous que strcmp renvoie 0 pour l'égalité - if (strcmp(a, b)) est vrai quand les chaînes diffèrent. Les fonctions de chaînes couvrent en détail les motifs plus sûrs strncpy/snprintf.
math.h - les mathématiques
sqrt, pow, fabs, floor, ceil, round, fmod, les familles trigonométriques et logarithmiques, INFINITY et NAN.
C'est le seul en-tête qui peut demander une option d'édition de liens : sous Linux, ajoutez -lm à la fin de la commande de compilation, sinon l'éditeur de liens signale « undefined reference to sqrt ». Tour complet dans les fonctions mathématiques.
time.h - horloges et dates
Les deux décalages de struct tm piègent tout le monde : tm_year compte à partir de 1900, et tm_mon commence à 0. time(NULL) est aussi la graine habituelle de srand.
ctype.h - la classification des caractères
Petit, et plus utile qu'il n'en a l'air. Chaque fonction prend un caractère et répond à une question oui/non, ou convertit la casse.
L'ensemble complet : isalpha, isdigit, isalnum, isspace, isupper, islower, ispunct, isxdigit, isprint, plus toupper et tolower.
Remarquez le cast (unsigned char). Ces fonctions sont définies pour les valeurs représentables en unsigned char plus EOF ; un char simple est signé sur la plupart des systèmes, donc un octet au-dessus de 127 arrive comme un nombre négatif et l'appel devient un comportement indéfini. Le cast ne coûte rien et supprime toute la classe de problème.
Et préférez-les aux tests écrits à la main. c >= '0' && c <= '9' fonctionne par hasard, mais isdigit(c) dit ce que vous voulez dire et reste correct partout.
limits.h et float.h - les bornes des types
Jusqu'où peut aller un int sur cette machine ? Ces en-têtes y répondent, et ces réponses expliquent pourquoi le code portable demande au lieu de supposer.
INT_MAX est la façon de tester un débordement avant qu'il n'arrive, ce qui compte puisque le débordement signé est un comportement indéfini et non un rebouclage testable après coup.
stdbool.h et stdint.h - de meilleurs types
Le C n'avait pas de type booléen avant C99. <stdbool.h> en fournit un :
bool, true et false sont des macros pour _Bool, 1 et 0, mais elles rendent l'intention évidente. (En C23, ils sont devenus des mots-clés et l'en-tête n'est plus nécessaire.)
<stdint.h> donne des types de largeurs garanties - essentiel pour les formats de fichiers, les protocoles réseau et tout l'embarqué, où « un int fait probablement 32 bits » ne suffit pas :
Les macros du style PRId32 de <inttypes.h> se développent en le bon spécificateur printf pour chaque type de largeur fixe sur la plateforme courante - c'est la façon portable de les afficher, puisque %d convient pour int32_t sur certains systèmes et pas sur d'autres.
assert.h - vérifier vos hypothèses
assert(expr) ne fait rien quand l'expression est vraie et abandonne le programme avec un message quand elle est fausse.
Compiler avec -DNDEBUG supprime chaque assertion, elles ne coûtent donc rien dans une version de production. C'est aussi l'avertissement : ne mettez jamais d'effet de bord dans un assert. assert(read_next() > 0) arrête complètement la lecture dans la version de production, et le bug qui en résulte n'apparaît qu'en production.
Les assertions sont pour vos erreurs - des conditions qui devraient être impossibles si le code est correct. Une mauvaise saisie utilisateur n'est pas une assertion ; c'est un if et un message d'erreur.
Le reste, brièvement
<stddef.h>-size_t,ptrdiff_t,NULL,offsetof<stdarg.h>- les fonctions variadiques, la machinerie derrièreprintf<errno.h>-errnoplusperroretstrerrorpour signaler pourquoi un appel a échoué<signal.h>- la gestion des signaux comme Ctrl-C<setjmp.h>- les sauts non locaux ; rarement la bonne réponse<locale.h>,<wchar.h>,<wctype.h>- locales et caractères larges<stdnoreturn.h>,<stdalign.h>,<threads.h>,<stdatomic.h>- les ajouts de C11
Deux habitudes rendent la bibliothèque agréable à utiliser. Lisez la page de manuel avant de deviner une signature - man 3 strtol sous macOS et Linux fait autorité et va vite. Et vérifiez les valeurs de retour : malloc, fopen et strtol signalent tous l'échec, et un programme qui les ignore échoue bien plus tard et bien moins clairement.
Questions fréquentes
Qu'est-ce que la bibliothèque standard du C ?
L'ensemble des fonctions, types et macros que toute implémentation C conforme fournit, regroupés dans une trentaine d'en-têtes. Elle couvre l'entrée-sortie (<stdio.h>), la mémoire et les conversions (<stdlib.h>), les chaînes (<string.h>), les mathématiques (<math.h>), le temps, la classification de caractères, et les limites des types numériques. Le C n'a aucune E/S ni gestion de chaînes intégrée - tout vient d'ici.
Quelle est la différence entre stdio.h et stdlib.h ?
<stdio.h> est l'entrée-sortie : printf, scanf, fopen, fgets, FILE. <stdlib.h> regroupe les utilitaires généraux : malloc et free, atoi et strtol, rand et srand, exit, qsort, bsearch. Un programme typique inclut les deux.
À quoi sert ctype.h ?
Il classe et convertit les caractères isolés : isdigit, isalpha, isalnum, isspace, isupper, islower, ispunct, plus toupper et tolower. Les utiliser plutôt que des comparaisons écrites à la main comme c >= '0' && c <= '9' est plus clair et correct pour toute locale et tout jeu de caractères.
Faut-il lier quelque chose pour utiliser la bibliothèque standard du C ?
Non, avec une exception : les fonctions mathématiques. La bibliothèque C standard est liée automatiquement, mais sous Linux les implémentations de <math.h> vivent dans une bibliothèque séparée, donc sqrt et compagnie demandent -lm à la fin de la commande de compilation. Tout le reste ne demande que le bon #include.