Comment lire les entrées utilisateur en C avec scanf

11

Les constantes sont rigides. Ils ne changent pas. La vie n’est pas comme ça, et vos programmes de tests ne devraient pas non plus l’être. Si vous apprenez le C, les nombres codés en dur comme 5 et 7 vieillissent rapidement. Vous voulez de l’interaction. Vous voulez que l’ordinateur attende que vous tapiez quelque chose.

Entrez « scanf ».

C’est l’autre moitié de l’histoire de « printf ». Pendant que « printf » pousse les données vers l’écran, « scanf » extrait les données du clavier. Ce n’est pas l’outil le plus robuste de la bibliothèque standard C, mais pour une simple saisie sur console, il fait le travail sans avoir besoin d’une dépendance tierce.

Voici comment prendre un script statique et le rendre dynamique.

Le code

Copiez ceci. Exécutez-le. Tapez des chiffres quand il vous le demande.

Décomposer scanf

La magie opère dans ces deux lignes :

scanf("%d", &a);

  • scanf  : Le nom de la fonction. Abréviation de « scanner l’entrée formatée ».
  • "%d"  : Le spécificateur de format. Il indique à « scanf » d’attendre un nombre entier. Si vous lisiez un flottant, vous utiliseriez "%f".
  • &a  : C’est la partie critique. Vous ne transmettez pas la valeur de a. Vous transmettez l’adresse de a.

Pensez-y de cette façon : printf doit savoir ce qu’il y a à l’intérieur de la variable. scanf a besoin de savoir placer les données. L’opérateur & fournit cette adresse mémoire. Sautez l’esperluette et vous vous écraserez. Ou pire, vous recevrez un avertissement qui ressemble à du charabia et une variable qui ne change pas.

Comment ça marche en pratique

Lorsque vous exécutez le programme :

  1. Le terminal affiche : Entrez la première valeur :
  2. Le curseur clignote. Ça attend. Vous êtes coincé ici jusqu’à ce que vous tapiez quelque chose et que vous appuyiez sur Entrée.
  3. Vous tapez « 5 ». Vous appuyez sur Entrée.
  4. scanf récupère ce 5, convertit la chaîne de caractères “5” en valeur entière 5 et la stocke à l’adresse mémoire &a.
  5. La même boucle se produit pour la deuxième valeur.

Vient ensuite le calcul. c = a + b;. Ajout simple.

Enfin, printf affiche le résultat. Mais remarquez la chaîne de format : printf("%d + %d = %d\n", a, b, c);. Vous réinjectez les variables dans la chaîne. C’est ainsi que vous créez une sortie lisible.

Pourquoi c’est important

La plupart des applications modernes n’utilisent pas l’entrée de la console. Vous ne tapez pas de commandes dans une boîte noire de votre navigateur Web ou de votre éditeur de photos. Mais comprendre ce flux est fondamental.

Entrée -> Processus -> Sortie.

C’est la boucle de base de tous les logiciels. `

Comment scanf gère les adresses mémoire

Lorsque vous exécutez ce code, la différence entre le succès et un crash d’exécution se résume à un seul caractère. Plus précisément, l’esperluette (& ) avant les variables a et b.

Il s’agit de l’opérateur d’adresse. Il indique à scanf exactement où en mémoire stocker l’entrée qu’il reçoit. Sans cela, scanf ne connaît pas l’emplacement de la variable. Il obtient simplement une valeur, ce qui est inutile pour stocker des données dans le programme. Si vous l’omettez, le programme ne sera pas compilé ou plantera immédiatement après son exécution. Vous avez besoin de cet opérateur pour les types char, int, float et structure.

Essayez de le supprimer. Regardez ce qui se passe. C’est une leçon douloureuse mais nécessaire sur la façon dont C gère la mémoire.

Maîtriser la sortie printf

printf est votre fenêtre pour l’utilisateur. Il envoie les données vers la sortie standard. La version la plus simple est directe.

Cela imprime le mot Bonjour. Rien d’autre. Pas de saut de ligne. Le curseur reste juste après le « o ».

Ajoutez un caractère de nouvelle ligne.

La sortie passe maintenant à la ligne suivante. Le \n est un retour chariot. C’est essentiel pour une sortie lisible de la console.

Les variables changent la donne. Vous ne pouvez pas simplement imprimer un nom de variable comme vous le faites en Python ou JavaScript. Vous devez utiliser un espace réservé.

Le %d est un espace réservé. Il est remplacé par la valeur entière de « b » au moment de l’exécution. C’est ainsi que C gère la sortie dynamique.

Vous pouvez mélanger du texte et des variables. Une méthode maladroite consiste à enchaîner plusieurs impressions.

Ça marche. Il est également verbeux. L’approche plus propre intègre tout dans une seule chaîne.

Plusieurs valeurs fonctionnent également. Gardez simplement les espaces réservés alignés avec les arguments.

L’ordre compte. Le premier %d correspond à a. La seconde à b. Le troisième à « c ». Si vous les échangez, le calcul est faux. Si vous en manquez un, le comportement n’est pas défini. Le nombre et le type d’opérateurs dans la chaîne de format doivent correspondre exactement aux paramètres.

Espaces réservés spécifiques au type

C est strict sur les types. Vous ne pouvez pas utiliser le même espace réservé pour tout. Vous devez faire correspondre le type de données au spécificateur de format.

  • Utilisez %d pour int (valeurs entières).
  • Utilisez %f pour float (nombres à virgule flottante).
  • Utilisez %c pour char (caractères uniques).
  • Utilisez %s pour les chaînes de caractères (tableaux de caractères).

Si vous utilisez %d pour un float, vous obtenez une sortie inutile. Si vous utilisez %s pour un entier, le programme plantera probablement. La précision n’est pas facultative ici.

Pour plus de détails sur ces spécificateurs, consultez le manuel UNIX. Tapez « homme 3 printf ». D’autres compilateurs fournissent une documentation similaire. Cela vaut la peine d’être lu.

Les pièges courants à éviter

Les compilateurs C sont utiles, mais ils ne lisent pas dans les pensées. Vous ferez des erreurs. Voici comment éviter les plus courants.

  1. Sensibilité à la casse : C est sensible à la casse. Printf ou PRINTF échouera. Ce doit être printf. Il en va de même pour les noms de variables et les appels de fonctions.
  2. Manquant l’opérateur d’adresse : Oublier le & dans scanf est une erreur fréquente. Cela provoque un échec d’exécution immédiat. Incluez-le toujours pour les types primitifs.
  3. Paramètres incompatibles : trop ou pas assez d’arguments dans printf ou scanf entraînent des erreurs. La chaîne de format dicte la structure. Tenez-vous-y.
  4. Variables non déclarées : Vous devez déclarer une variable avant de l’utiliser. C ne déduit pas les types. Vous définissez int a; avant de pouvoir imprimer a.

Ces erreurs sont répétitives. Ils sont également faciles à réparer une fois que vous reconnaissez le motif.