Fiabilisation des lectures au clavier. Problèmes liés à scanf: rencontre de caractères invalides Sans arrêt prématuré: compte = scanf(``%d%c``;&n,&c);

Slides:



Advertisements
Présentations similaires
Premier programme en C :
Advertisements

La boucle for : init7.c et init71.c
Cours de C – Séance dexercices 12 Octobre Exercice 5 Idem quexercice 1 : lire une ligne au clavier Sans limitation de la longueur de la ligne (utilisez.
Cours de C – Séance dexercices 25 Septembre 2007.
Introduction au Langage C,C++
Rappels C.
GEF 243B Programmation Informatique Appliquée
L’ interruption de boucle
C.
Tableaux Certains problèmes nécessitent beaucoup de variables du même type. Exemple : relevé de températures matin et soir dans 10 villes pour 10 jours.
FLSI602 Génie Informatique et Réseaux
FLSI602 Génie Informatique et Réseaux
CYCLE 6 : FONCTIONS FONCTIONS avec paramètres en Entrée 1- Pourquoi les FONCTIONS peuvent échanger des données en E entre elles ? 2- Comment écrire des.
Common Gateway Interface
Langage C Révision.
CPI/BTS 2 Programmation Web Introduction au PHP
Récursivité.
Rappel et compléments de la programmation en langage C
Les dates Recherche d’un algorithme pour déterminer si une année est bissextile ou non.
Le langage C++ Langage orienté objet
Programme de baccalauréat en informatique Algorithmique et programmation IFT-1001 Thierry EUDE Hatem Mahbouli Laboratoire #12 Département dinformatique.
TRAITEMENT DE STRUCTURES
Les fichiers et les chaînes de caractères
FICHIERS.
Lecture et écriture de données
Instruction sélective switch-case Instruction répétitive do-while For
IFT 6800 Atelier en Technologies d’information
ECP – Option SA Henri Fallon
Plan troisième cours Instruction sélective Instruction répétitive
LANGAGE C LP A2I IUT St DIE
Les Opérateurs Ils régissent toutes les opérations ou transformations sur les valeurs des variables. Opérateur d'affectation Opérateurs arithmétiques Opérateurs.
Les fichiers texte en C++
L’essentiel du langage C
Structures des données
Bonjour Mes Amis Hello Friends.
B.Shishedjiev - Informatique II
Les Pointeurs et les Tableaux Statiques et Tableaux Dynamiques
CYCLE 6 : FONCTIONS Faire un programme en C avec des FONCTIONS 1- A quoi servent les FONCTIONS ? 2- Comment écrire un programme avec FONCTIONS ? 3- Comment.
et quelques rappels sur certains éléments du langage C
Les adresses des fonctions
1 FICHIERS. 2 Les Fichiers  Les "entrées-sorties conversationnelles" échangent des informations entre le programme et l'utilisateur.  Le terme de fichier.
SIF-1053 Architecture des ordinateurs
ALGORITHMIQUE ET PROGRAMMATION C
Scripts shell intro Un script bash est un fichier contenant une suite de commandes shell, exécutables par l'interpréteur (ici le programme /bin/bash),
Argc et argv Utilisation des paramètres de la ligne de commande.
Un survol du language C.
1 Structures des données. 2  Le tableau permettait de désigner sous un seul nom un ensemble de valeurs de même type, chacune d'entre elles étant repérée.
Les chaînes de caractères
Les classes et les objets Les données finales class A { … private final int n = 20 ; // la valeur de n est définie dans sa déclaration … } class A { public.
TABLEAUX des POINTEURS TRAITEMENT DE STRUCTURES
Structures de contrôle
Le Préprocesseur. Sujets abordés: Préprocesseur –Qu’est ce? –Qu’est ce qu’une directive? Les macros –Les définir, les redéfinir, les dé-définir –Les macros.
Conception de Programmes - IUT de Paris - 1ère année – Cours 8 – Les entrées/sorties Comment fonctionnent les opérateurs > pour les types élémentaires.
Les variables fichiers. Le type fichier On manipule les fichiers par l’intermédiaire de structures FILE décrites dans stdio.h FILE *monFichier; –Nom physique.
Introduction au langage C Les entrées-sorties
1. Spoon Christophe Delagarde, septembre 1998 I.U.T., Université de la Méditerrainée 2.
Programmation en C.
Les entrées-sorties élémentaires
Langage de programmation
PRO-1027 Programmation Scientifique en C
Tour rapide d’un premier programme SPARC v9
Les chaînes de caractères
Philippe Gandy - 22 septembre 2015 Basé sur les notes de cours de Daniel Morin et Roch Leclerc.
Exercices sur les pointeurs. lireCar/remettreCar Lorsque l’on lit caractère par caractère, on ne peut pas savoir qu’on a atteint un caractère avant de.
Informatique 2A Langage C 1 ère séance.
Informatique 2A Langage C 5ème séance. Déroulement de la séance 5 1 ère partie Étude des chaînes de caractères 2 ème partie Les structures 3.
Tableaux et Pointeurs Chaînes de Caractères Programmation Impérative II.
A quoi sert la programmation? - indispensable pour plusieurs métiers. - passion. But du cours: - suite du cours Prog. Imp. I - fichiers, pointeurs, modularité.
Eléments de base du langage C
Eléments de base du langage C
Transcription de la présentation:

Fiabilisation des lectures au clavier

Problèmes liés à scanf: rencontre de caractères invalides Sans arrêt prématuré: compte = scanf(``%d%c``;&n,&c); 12a donne: n=12, c=`a` et compte=2 compte = scanf(``%d%d``;&n,&p); 12 45e10 donne: n=12, p=45 et compte=2 Avec arrêt prématuré: compte = scanf(``%d%d %c``;&n,&p,&c); b donne: n=12, p=25, c=`b`, compte=3 12b donne: n=12, p inch., c inch., compte=2 b donne: tout inchangé et compte =0 Prog peut boucler sur caractère invalide

Problème lié à scanf caractère fin de ligne est ambiguë c’est à la fois un séparateur et un caractère. Valider une entrée au clavier reviens à introduire le caractère `\n`dans le buffer, où il est susceptible d’être lu comme tel: printf(``donner un nombre: \n``); scanf(``%d``,&n); printf(``merci pour %d\n``,n); printf(``donner un caractère: \n``); scanf(``%c``,&c);

Problème lié à scanf manque de synchronisation entre lecture et affichage Int n,p; printf(``donner une valeur pour n: ``); scanf(``%d``,&n); printf(``merci pour %d\n``,n); printf(``donner une valeur pour p: ``); scanf(``%d``,&p); printf(``merci pour %d\n``,p); Donner une valeur pour n: Merci pour 12 Donner une valeur pour p: Merci pour 25

Démarche: Remplacer une lecture par scanf dans un format donné par deux opérations successives Lecture d’une chaîne représentant une ligne complète censée correspondre aux informations à lire (sous un format) Conversion de cette chaîne en un certain nombre d’informations, en utilisant le format, associé à sscanf

Scanf seul int n,n_val_ok; float x; char mot[31]; do{ while(1){ printf(``donner un entier, un flottant et une chaîne: \n``); n_va_ok = scanf(``%d %e %30s``, &n, &x, mot); if (n_val_ok ==3) break; printf(```*** réponse incorrect ***\n``); } printf(``merci pour %d, %e et %s \n``, n, x, mot); } while( n!=0 );

Scanf seul: résultat Donner un entier, un flottant et une chaîne: salut Merci pour e+00 et salut Donner un entier, un flottant et une chaîne: bonjour 10 Merci pour e+00 et bonjour Donner un entier, un flottant et une chaîne: hello Merci pour e+01 et 7.5 Donner un entier, un flottant et une chaîne: *** reponse incorrecte *** Donner un entier, un flottant et une chaîne: *** reponse incorrecte *** Donner un entier, un flottant et une chaîne: *** reponse incorrecte *** Donner un entier, un flottant et une chaîne:

Utilisation de gets int n,n_val_ok; float x; char mot[31], ligne[41]; do{ while(1){ printf(``donner un entier, un flottant et une chaîne: \n``); gets(ligne); n_va_ok = sscanf(ligne,``%d %e %30s``, &n, &x, mot); if (n_val_ok ==3) break; printf(```*** réponse incorrect ***\n``); } printf(``merci pour %d, %e et %s \n``, n, x, mot); } while( n!=0 );

Utilisation de gets Donner un entier, un flottant et une chaîne: salut Merci pour e+00 et salut Donner un entier, un flottant et une chaîne: bonjour 10 Merci pour e+00 et bonjour Donner un entier, un flottant et une chaîne: hello Merci pour e+00 et hello Donner un entier, un flottant et une chaîne: bye *** reponse incorrecte *** Donner un entier, un flottant et une chaîne: Merci pour e+00 et 3 Donner un entier, un flottant et une chaîne: Merci 0 0 et 0

utilisation de fgets contre le débordement #define LG_LIGNE 41 int n,n_val_ok; float x; char mot[31], ligne[LG_LIGNE]; do{ while(1){ printf(``donner un entier, un flottant et une chaîne: \n``); fgets(ligne,LG_LIGNE, stdin); n_va_ok = sscanf(ligne,``%d %e %30s``, &n, &x, mot); if (n_val_ok ==3) break; printf(```*** réponse incorrect ***\n``); } printf(``merci pour %d, %e et %s \n``, n, x, mot); } while( n!=0 );

utilisation de fgets contre le débordement Donner un entier, un flottant et une chaîne: salut Merci pour e+00 et salut Donner un entier, un flottant et une chaîne: bonjour 10 Merci pour e+00 et bonjour Donner un entier, un flottant et une chaîne: hello Merci pour e+00 et hello Donner un entier, un flottant et une chaîne: Merci pour e+00 et 11 Donner un entier, un flottant et une chaîne: Merci pour e+02 et 666 Donner un entier, un flottant et une chaîne: Merci 0 0 et 0

Pour ignorer les caractères excédentaires #define LG_LIGNE 41 …. do{ while(1){ printf(``donner un entier, un flottant et une chaîne: \n``); fgets(ligne,LG_LIGNE, stdin); n_va_ok = sscanf(ligne,``%d %e %30s``, &n, &x, mot); if (n_val_ok ==3) break; printf(```*** réponse incorrect ***\n``); } printf(``merci pour %d, %e et %s \n``, n, x, mot); if((strlen(ligne)==LG_LIGNE-1) && (ligne[LG_LIGNE-2]!=`\n`)) do c=getchar(); while (c != `\n`); } while( n!=0 );

Pour ignorer les caractères excédentaires Donner un entier, un flottant et une chaîne: salut Merci pour e+00 et salut Donner un entier, un flottant et une chaîne: bonjour 10 Merci pour e+00 et bonjour Donner un entier, un flottant et une chaîne: hello Merci pour e+00 et hello Donner un entier, un flottant et une chaîne: Merci pour e+00 et 11 Donner un entier, un flottant et une chaîne: 9 9 Bye Merci pour e+00 et Bye Donner un entier, un flottant et une chaîne: Merci 0 0 et 0