Lire et vérifier une saisie en C et C++
Dans cette leçon, vous allez lire les données saisies par l'utilisateur et rejeter les valeurs invalides en C comme en C++.
Introduction
La lecture d'une saisie peut toujours échouer, par exemple quand le programme attend un nombre et que l'utilisateur tape des lettres. Le programme doit donc vérifier le résultat de la lecture au lieu de supposer que les données sont toujours correctes.
Points importants
- Activez les avertissements du compilateur (compiler warnings) et corrigez-les tous.
- Comprenez bien le type et la durée de vie (lifetime) de chaque valeur.
- Vérifiez toujours les données d'entrée et les limites des indices de tableau.
Exemples de code C et C++
#include <stdio.h>
int main(void) {
int age;
printf("Age: ");
if (scanf("%d", &age) != 1 || age < 0) {
puts("Invalid age");
return 1;
}
printf("Next year: %d\n", age + 1);
return 0;
}
Age: 20
Next year: 21
#include <iostream>
int main() {
int age;
std::cout << "Age: ";
if (!(std::cin >> age) || age < 0) {
std::cerr << "Invalid age\n";
return 1;
}
std::cout << "Next year: " << age + 1 << '\n';
}
Age: 20
Next year: 21
Comparaison entre C et C++
En C, scanf renvoie le nombre de valeurs lues avec succès, la condition scanf(...) != 1 indique donc que la lecture de l'âge a échoué. En C++, quand std::cin ne parvient pas à lire une donnée du type demandé, il passe dans un état d'erreur et l'expression de test devient fausse. Les deux programmes rejettent aussi les âges négatifs.
C utilise de petites fonctions procédurales et montre ouvertement comment les données sont représentées en mémoire.
C++ permet toujours de travailler à bas niveau, mais ajoute des types de bibliothèque et des abstractions plus sûres.
Exercices d'approfondissement
Exécutez les deux versions, puis modifiez le code pour observer la différence de sécurité qu'apporte chaque langage.
- Testez des entrées invalides et des valeurs limites.
- Compilez avec les options -Wall -Wextra -Wpedantic pour activer davantage d'avertissements.
- Placez les déclarations communes dans un fichier d'en-tête et l'implémentation dans un fichier séparé.
S'entraîner avec un défi
Utilisez le contenu de cette leçon pour résoudre un vrai problème. Chaque défi s'exécute dans le navigateur, avec des tests instantanés et une revue par l'IA.
- Average of Three Average three whole numbers. Facile
- Rectangle Perimeter Compute the perimeter of a rectangle from its sides. Facile