Entrées et Sorties de chaînes de caractères en C

@joekakone

Joseph Konka @joekakone

03/03/2026 · 7 min

Maîtrisez la saisie et l'affichage sécurisés de chaînes en C : fgets() vs scanf(), suppression du retour à la ligne résiduel, puts(), et bannissement de gets().

Manipuler du texte au clavier et sur la console d'exécution en langage C exige une grande rigueur. Une mauvaise gestion de la mémoire tampon peut entraîner l'une des failles de sécurité les plus célèbres de l'histoire informatique : le dépassement de tampon (Buffer Overflow).

Cette leçon vous enseigne comment saisir et afficher des chaînes de caractères avec des espaces de manière 100 % sécurisée.


1. Afficher des chaînes : printf(), puts() et fputs()#

Pour imprimer une chaîne de caractères sur la console :

Fonction Caractéristique Exemple
printf("%s", str) Puissant, permet d'entremêler d'autres variables formatées. Pas de saut de ligne automatique. printf("Bienvenue %s !\n", nom);
puts(str) Rapide et concis. Ajoute automatiquement un saut de ligne \n à la fin. puts("Connexion reussie.");
fputs(str, stdout) Écrit sur la sortie standard sans ajouter de saut de ligne. fputs("Veuillez patienter...", stdout);
comparatif_affichage.c
#include <stdio.h>

int main(void)
{
    char titre[] = "AlgoJungle Formation";

    printf("1. Avec printf : %s (pas de retour)\n", titre);
    puts("2. Avec puts (retour a la ligne automatique)");
    fputs("3. Avec fputs (direct)", stdout);
    printf(" <- colle au texte precedent\n");

    return 0;
}

2. Saisie avec scanf("%s") : Ses limites critiques#

La fonction scanf avec le spécificateur %s présente deux défauts majeurs : 1. Elle s'arrête au premier espace : Si l'utilisateur saisit "Jean Dupont", scanf ne lira que "Jean", laissant " Dupont" dans le tampon d'entrée. 2. Elle ne contrôle pas la taille du tableau : Si votre tableau fait 10 cases et que l'utilisateur tape un mot de 50 lettres, scanf écrira aveuglément au-delà de la mémoire allouée, corrompant la mémoire du programme.

// Si vous devez utiliser scanf pour un mot simple, BORNEZ impérativement la saisie !
char mot[20];
scanf("%19s", mot); // Ne lira au maximum que 19 caractères (+ le '\0')

3. La solution professionnelle et sécurisée : fgets()#

Pour lire une ligne entière (contenant des espaces, des prénoms composés ou des phrases complètes), la fonction de référence est fgets() (file get string) :

\[\mathbf{fgets( \underbrace{\text{tampon}}_{\text{Tableau récepteur}} \text{ , } \underbrace{\text{sizeof(tampon)}}_{\text{Taille maximale autorisée}} \text{ , } \underbrace{\text{stdin}}_{\text{Entrée standard clavier}} )}\]

fgets garantit formellement qu'aucun débordement de mémoire n'aura lieu : elle lira au plus taille - 1 caractères et ajoutera automatiquement le caractère de terminaison '\0'.

Nettoyer le \n capturé par fgets#

Contrairement à scanf, fgets conserve le caractère de fin de ligne \n produit par la touche Entrée. Pour le supprimer proprement :

saisie_securisee_complete.c
#include <stdio.h>
#include <string.h>

#define LONGUEUR_MAX 50

int main(void)
{
    char nom_complet[LONGUEUR_MAX];

    printf("Entrez votre nom et prenom complet : ");

    // 1. Saisie sécurisée avec fgets
    if (fgets(nom_complet, sizeof(nom_complet), stdin) != NULL)
    {
        // 2. Remplacement du '\n' final par le caractère nul '\0'
        nom_complet[strcspn(nom_complet, "\n")] = '\0';

        // 3. Affichage
        printf("Fiche enregistree : [%s] (Longueur : %zu caracteres)\n", 
               nom_complet, strlen(nom_complet));
    }

    return 0;
}

4. Pourquoi gets() est formellement bannie#

[!WARNING] La fonction historique gets(str) ne prend aucun paramètre de taille maximale. En 1988, le célèbre ver informatique de Morris (Morris Worm) a paralysé 10 % d'Internet en exploitant une faille de dépassement de tampon dans gets().

L'utilisation de gets() est considérée comme une faute professionnelle grave : elle a été dépréciée par la norme C99 et totalement bannie et supprimée de la norme C11. Tout compilateur moderne rejettera son utilisation.


Vous maîtrisez désormais les entrées et sorties de texte. Découvrons dans la leçon suivante la panoplie des fonctions de manipulation de chaînes fournies par <string.h>.

Commentaires

Inscrivez-vous à une formation complète

Voir le catalogue