Le codage en dur des nombres convient pour une première tentative, mais le vrai logiciel doit réagir à ce que les gens tapent. L’extrait d’origine utilisait des constantes. C’est statique. Prévisible. Ennuyeux.

Pour rendre un programme utile, vous devez extraire les données de l’utilisateur au moment de l’exécution. Vous faites cela avec scanf. C’est l’équivalent de printf. Là où « printf » envoie les données vers l’écran, « scanf » les récupère depuis le clavier.

Voici comment gérer la saisie entière de base en C.

Capturer les entrées de l’utilisateur

Vous ne pouvez pas simplement déclarer une variable et vous attendre à ce qu’elle contienne les données utilisateur comme par magie. Vous devez le demander. Vous devez également indiquer à l’ordinateur stocker ces données. C’est pourquoi scanf nécessite un pointeur (le symbole & ). Si vous oubliez l’esperluette, le programme plantera ou écrira des déchets dans la mémoire. Incluez-le toujours pour les types primitifs comme « int ».

Considérez cette logique mise à jour :

  1. Déclarez les variables pour contenir l’entrée et le résultat.
  2. Inviter l’utilisateur pour qu’il sache quoi taper.
  3. Utilisez scanf avec le spécificateur de format correct (%d pour les entiers).
  4. Effectuez le calcul en utilisant les valeurs stockées.
  5. Affichez le résultat en mélangeant les variables d’entrée dans la chaîne d’impression.

Pourquoi c’est important

Le passage des constantes aux variables change tout. Le programme n’est plus un disque rayé. Il s’adapte. Vous pouvez l’exécuter une fois avec 5 et 7. Vous pouvez l’exécuter à nouveau avec 100 et 200. La logique reste la même ; les données changent.

C’est la base des applications interactives CLI (Command Line Interface). Avant de pouvoir créer des outils complexes, vous devez comprendre comment importer des données dans vos variables en toute sécurité.

Points clés à retenir

  • scanf a besoin d’un pointeur : Utilisez toujours l’opérateur d’adresse de (& ) avant le nom de votre variable dans scanf.
  • Les spécificateurs de format doivent correspondre : Si vous lisez un int, vous devez utiliser %d. L’utilisation de %f pour un entier entraînera un comportement indéfini.
  • Les invites sont cruciales : Sans une invite claire telle que « Entrez la première valeur : », l’utilisateur se retrouve face à un curseur clignotant, se demandant si le programme est gelé. Ce n’est pas le cas. C’est juste attendre.

Le code fonctionne. C’est simple. Mais c’est fonctionnel. Vous êtes passé d’un script statique à un outil dynamique. L’étape suivante est généralement la gestion des erreurs. Que se passe-t-il si l’utilisateur tape « bonjour » au lieu d’un numéro ? scanf échouera silencieusement, laissant vos variables non initialisées. C’est un problème pour un autre jour.

Pour l’instant, vous disposez d’un programme qui écoute réellement.

Entrées, sorties et règles d’engagement

Vous avez effectué les modifications. Maintenant, compilez. Exécutez-le. S’il plante, ne paniquez pas. Il a probablement manqué un petit détail de syntaxe.

Prenez « scanf ». Il imite printf dans son utilisation des chaînes de format. Tapez « man scanf » si vous avez besoin des petits caractères. Mais faites attention à l’esperluette (& ) avant les variables comme a et b.

Il s’agit de l’opérateur d’adresse.

Il renvoie l’adresse mémoire de la variable. Cela peut paraître déroutant maintenant. Les pointeurs clarifieront cela plus tard. Mais pour l’instant, suivez la règle : si vous utilisez scanf sur un char, int ou float, vous avez besoin du &. Vous en avez également besoin pour les structures.

Passer le « & » ? Vous obtiendrez une erreur d’exécution. Cassez-le intentionnellement. Voyez ce qui se passe. C’est la seule façon de se rappeler pourquoi c’est important.

Formater la sortie avec précision

Analysons printf. Commencez simplement.

printf("Bonjour");

Cela envoie le mot « Bonjour » à la sortie standard. Rien d’autre. Pas de nouvelle ligne. Le curseur reste juste après le “o”.

Ajoutez maintenant une nouvelle ligne.

printf("Bonjour\n");

Le \n déclenche un retour chariot. La sortie se termine sur sa propre ligne. C’est l’attente standard pour une sortie de console propre.

Les variables nécessitent des espaces réservés. Pour imprimer la valeur de b :

printf("%d", b);

Le %d est un espace réservé. Lorsque le code s’exécute, « printf » l’échange contre la valeur entière réelle de « b ».

Vous pouvez intégrer des valeurs dans des phrases. Vous pourriez enchaîner plusieurs appels :

printf("La température est de "); printf("%d", b); printf(" degrés\n");

Mais c’est fastidieux. L’approche plus propre les combine en une seule chaîne de format :

printf("La température est de %d degrés\n", b);

Plusieurs valeurs fonctionnent également.

printf("%d + %d = %d\n", a, b, c);

Voici le piège. Le nombre d’espaces réservés dans la chaîne de format doit correspondre au nombre de variables qui la suivent. Exactement.

Si vous avez trois balises %d, vous avez besoin de trois paramètres. Les types doivent correspondre. La commande doit correspondre. Ça ne correspond pas ? Le résultat sera une poubelle. Ou pire, il va planter.

Faire correspondre les types aux espaces réservés

printf gère la plupart des types C standard. Vous avez juste besoin du bon code.

  • int utilise %d
  • float utilise %f
  • char utilise %c
  • les chaînes de caractères utilisent %s

Pour des nuances plus profondes, vérifiez « man 3 printf » sur un système UNIX. Votre compilateur spécifique disposera probablement d’un manuel ou d’un fichier d’aide qui couvre les cas extrêmes.

Pièges courants

Les nouveaux développeurs trébuchent dessus à plusieurs reprises.

La sensibilité à la casse est stricte. printf est en minuscule. Printf ou PRINTF échouera.

scanf demande l’opérateur d’adresse (& ). Oubliez ça, et le programme ne stockera pas correctement votre entrée.

Le nombre de paramètres est important. Trop ou pas assez d’arguments dans printf ou scanf conduisent à un comportement indéfini.

La déclaration précède l’utilisation. Vous ne pouvez pas utiliser un nom de variable en C sans le déclarer au préalable. Le compilateur doit connaître au préalable la disposition et le type de la mémoire.

Le compilateur ne devine pas. Il s’applique.