Comment fonctionne scanf en C : saisie, formatage et pièges courants

4

La saisie est l’élément vital de tout programme interactif. Sans cela, vous faites simplement fonctionner une calculatrice dans le vide. Dans le langage de programmation C, le cheval de bataille pour récupérer les données du clavier est « scanf ». C’est simple. C’est partout. Mais il est également connu pour être impitoyable lorsque les choses tournent mal.

Pour les scripts de base ou les prototypes rapides, « scanf » fait l’affaire. Il lit à partir de stdin (entrée standard). Si vous tapez sur un clavier, c’est là que vos personnages atterrissent. La fonction est polyvalente, mais elle manque de gestion robuste des erreurs. Il s’en fiche si vous tapez une lettre alors qu’il attend un chiffre. Il restera là, ou pire, fera planter votre programme. C’est pourquoi il est idéal pour les tâches simples mais médiocre pour les logiciels de production.

La syntaxe et l’esperluette

Examinons le cas d’utilisation le plus simple possible. Vous voulez un entier. Vous le demandez. Vous le stockez.

scanf("%d", &b);

C’est tout. Deux arguments. La chaîne de format et la cible.

Le %d indique à scanf d’attendre un entier. C’est le même espace réservé que vous utilisez dans printf. La variable b doit être déclarée comme un int. Si ce n’est pas le cas, vous cherchez des ennuis.

Voici la partie qui fait trébucher les débutants à chaque fois : l’esperluette (& ).

&b n’est pas une faute de frappe. C’est un pointeur. Plus précisément, c’est l’adresse de la variable « b ». scanf ne prend pas la valeur ; il a besoin de l’emplacement mémoire dans lequel écrire l’entrée. Oubliez le « & ». Votre code pourrait être compilé. Mais quand tu l’exécutes ? Accident. Défaut de segmentation. Vide. Le programme se terminera presque certainement brusquement car il tente d’écrire sur une adresse mémoire aléatoire.

Indicateurs de formatage

scanf utilise les mêmes spécificateurs de conversion que printf. Si vous connaissez l’un, vous connaissez l’autre. Mais le contexte compte.

  • Entiers : %d
  • Nombres à virgule flottante : %f
  • Caractères uniques : %c
  • Chaînes : %s

Gardez-les droits. Échangez un « %f » contre un entier et vous obtiendrez des données inutiles ou un crash.

Pourquoi scanf ne suffit pas

Vous pouvez enchaîner les appels scanf pour lire plusieurs valeurs.

Cela fonctionne pour les nombres. C’est assez propre. Mais essayez de lire une ligne complète de texte ? Ça casse. scanf avec %s s’arrête au premier espace. Il ne lit pas toute la ligne. Et il ne gère pas les débordements de tampon en toute sécurité.

Pour les vrais programmes, vous devez éviter « scanf » pour la saisie de texte. Utilisez plutôt « gets » (qui est obsolète et dangereux) ou, de préférence, « fgets ». Ces fonctions lisent une ligne à la fois dans un tampon. Une fois que vous avez la ligne, vous pouvez l’analyser. Vous pouvez vérifier les erreurs. Vous pouvez vérifier que l’entrée ressemble à un nombre avant d’essayer de la convertir. scanf ignore cette étape. Cela suppose que vous savez ce que vous faites. Ce n’est généralement pas le cas.

Casser des choses volontairement

La meilleure façon d’apprendre le C n’est pas de lire la documentation. C’est en cassant le compilateur.

Prenez cet extrait :

Modifiez-le. Pire encore.

Supprimez b de la déclaration de variable. Regardez le compilateur crier à propos d’une variable non définie.

Supprimez un point-virgule. Voyez comment l’erreur de syntaxe se propage.

Retirez une attelle. Regardez l’analyseur perdre la tête.

Supprimez une parenthèse. Observez la confusion