SCANF |
Balayage de format |
---|---|
Langage C | stdio.h |
Syntaxe
int scanf(const *format,...); |
Paramètres
Nom | Description |
---|---|
format | Ce paramètre permet d'indiquer le format contenant l'expression à traiter |
Description
Cette fonction permet la lecture de texte suivant un certain format dans une console standard.
Algorithme
MODULE SCANF(format, ...) SI format est NULL ALORS * Erreur : format invalide RETOURNE ERROR_INVALID_FORMAT FIN SI arguments ← parse_variadic_arguments(...) * Lire l'entrée utilisateur input_buffer ← read_from_stdin() elements_read ← 0 current_position ← 0 BOUCLE POUR CHAQUE spécificateur dans format FAIRE SI spécificateur est un espace blanc ALORS skip_whitespace(input_buffer, current_position) SINON SI spécificateur correspond au type d'entrée ALORS value ← extract_value(input_buffer, current_position, spécificateur) SI value est valide ALORS store_value_in_argument(arguments[elements_read], value) elements_read ← elements_read + 1 SINON * Arrêter si une lecture échoue break FIN SI FIN SI FIN BOUCLE POUR CHAQUE * Retourne le nombre d'éléments assignés RETOURNE elements_read |
Remarques
- Retourne le nombre de valeurs lues avec succès : scanf retourne un entier représentant le nombre de champs correctement remplis. Si aucune donnée n'est lue avec succès (par exemple, en cas d'erreur de format), elle retourne 0 ou EOF en cas de fin de fichier ou d'erreur critique.
- Vérification des erreurs&nbps;: Il est essentiel de vérifier la valeur de retour de scanf pour s'assurer que les données ont été correctement lues et interprétées. Ignorer ce retour peut provoquer des comportements indéterminés dans le programme si les variables ne contiennent pas les valeurs attendues.
- Problèmes avec les espaces et les retours à la ligne : scanf ignore automatiquement les espaces blancs (espaces, tabulations, retours à la ligne) pour certains types comme %d ou %f. Cependant, pour des types comme %c ou %s, les espaces blancs peuvent entraîner un comportement inattendu, nécessitant une gestion manuelle.
- Risques de dépassement de mémoire : Lors de la lecture de chaînes de caractères avec %s, scanf ne limite pas la taille de la chaîne de caractères, ce qui peut provoquer un dépassement de mémoire si l'entrée dépasse la taille du tableau. Utilisez des formats sécurisés comme %Ns (où N est la taille maximale de la chaîne de caractères) ou préférez fgets dans ces cas.
- Gestion des pointeurs : Les paramètres passés à scanf doivent être des pointeurs, car elle modifie directement les valeurs des variables via leur adresse. Une erreur courante est de passer une variable au lieu de son adresse pour les types de base (comme int ou float).
- Sensibilité au format : Le format spécifié dans scanf doit correspondre précisément aux données fournies. Par exemple, lire un entier avec %d alors qu'une valeur flottante est entrée peut entraîner un échec ou un comportement indéfini. De plus, un mauvais alignement entre le format et les arguments peut causer des plantages.
- Limitations et alternatives : Bien que scanf soit pratique pour des cas simples, elle peut être difficile à utiliser dans des scénarios complexes, comme la lecture de lignes entières ou le traitement d'entrées non structurées. Dans ces situations, fgets pour lire une ligne complète, combinée avec sscanf pour analyser le contenu, est souvent une meilleure approche.
Exemple
Voici un exemple permettant de demander de poser une question :
Essayer maintenant !
on obtiendra le résultat suivant :
Entrer une votre message (max 255 caracteres) :Voir également
Langage de programmation - C - Référence de procédures et fonctions - atof
Langage de programmation - C - Référence de procédures et fonctions - getc
Langage de programmation - C - Référence de procédures et fonctions - printf
Langage de programmation - C++ - Référence de procédures et fonctions - scanf
Références
Langage C, Edition Micro-Application, Gehard Willms, 2001, ISBN: 2-7429-2008-0, page 734.
Borland C++ for Windows 4.0, Library Reference, Edition Borland, 1993, Part # BCP1240WW21772, page 219.
Dernière mise à jour : Mardi, le 28 juillet 2015