[C++] Lecture au clavier - Gestion d'erreur

Voir le sujet précédent Voir le sujet suivant Aller en bas

[C++] Lecture au clavier - Gestion d'erreur

Message  Mr X le Sam 15 Déc 2007, 19:05

Bonjour,
comment faire pour que l'utilisateur ne puisse entrer que des données numériques ? Donc par exemple si un caractère, autre que numérique est entré, un message d'erreur s'affiche ! confused
Merci.

Mr X

Nombre de messages : 12
Date d'inscription : 31/05/2007

Revenir en haut Aller en bas

Re: [C++] Lecture au clavier - Gestion d'erreur

Message  LSV le Sam 15 Déc 2007, 19:06

un try and catch?

LSV

Nombre de messages : 638
Age : 27
Prénom : Jérome
Statut : Diplomé 2013
Localisation : Anderlecht
Date d'inscription : 24/09/2007

Revenir en haut Aller en bas

Re: [C++] Lecture au clavier - Gestion d'erreur

Message  yoda le Sam 15 Déc 2007, 19:07

eh bien tester les caracteres entre peut etre ....

yoda

Nombre de messages : 1119
Age : 33
Prénom : Antoine
Statut : Ancien
Localisation : Bruxelles
Date d'inscription : 17/12/2006

Revenir en haut Aller en bas

Re: [C++] Lecture au clavier - Gestion d'erreur

Message  Morbid le Sam 15 Déc 2007, 19:19

Ou en cherchant sur google comme tout le monde

Morbid

Nombre de messages : 894
Age : 30
Prénom : Christophe
Statut : Ancien (R)
Date d'inscription : 23/11/2006

Revenir en haut Aller en bas

Re: [C++] Lecture au clavier - Gestion d'erreur

Message  null le Sam 15 Déc 2007, 19:33

Ou alors, comme ça : (après, pour l'affichage d'une erreur, c'est tout simple)

Code:

string tampon;
int valeur;
char *verif = NULL;

do
{
        cin >> tampon;
        valeur = (int)strtol(tampon.c_str(), &verif, 10);
} while(*verif != NULL);

Wink

null

Nombre de messages : 441
Age : 29
Prénom : Sébastien
Statut : Ancien
Localisation : Anderlecht
Date d'inscription : 30/11/2006

Revenir en haut Aller en bas

Re: [C++] Lecture au clavier - Gestion d'erreur

Message  pbt le Sam 15 Déc 2007, 20:23

Mr X a écrit:Bonjour,
comment faire pour que l'utilisateur ne puisse entrer que des données numériques ?
C'est un problème qui me semble assez général. La bonne manière de faire -à mon sens- est de lire ce que l'utilisateur entre quelle que soit son entrée -il faut penser à l'utilisateur distrait qui entre systématiquement un char lorsque l'on demande un int et vice versa - et ensuite vérifier si ce qu'il a entré nous intéresse (comme t'a dit null).

Un peu un truc du genre
Code:

repeter
  lire (une ligne par exemple)
jusqu'à ce que ( ma lecture correspond à ce que je cherche)
utiliser ce que j'ai lu

En java tu utiliserais la méthode matches de la classe String pour voir si ta chaine correspond à ce que tu veux.

_________________
smartq.namok.be · faq ·  · IRC / irc.freenode.net #esi · blog.namok.be
style #pbt {heigth:189cm; weight:79kg; eye-color:#524000; hair:very short; dead pixels: some; }

pbt
Admin

Nombre de messages : 4862
Age : 45
Prénom : Pierre
Statut : prof
Localisation : La cité des géants
Date d'inscription : 24/11/2005

http://esi.namok.be

Revenir en haut Aller en bas

Re: [C++] Lecture au clavier - Gestion d'erreur

Message  nvs le Sam 15 Déc 2007, 21:13

null a écrit:Ou alors, comme ça : (après, pour l'affichage d'une erreur, c'est tout simple)

Code:

string tampon;
int valeur;
char *verif = NULL;

do
{
        cin >> tampon;
        valeur = (int)strtol(tampon.c_str(), &verif, 10);
} while(*verif != NULL);

Wink

il y a beaucoup de bon là dedans, mais :
  • je ne comprends pas pourquoi initialiser le pointeur (à NULL) et pas les autres variables ;
  • le NULL apparaissant dans le condition de boucle est totalement erroné : *verif est un char et non un pointeur ;
  • la lecture d'une chaîne avec la surcharge de l'opérateur >> s'arrête (entre autre) lorsqu'un espace est rencontré, donc si l'utilisateur fournit "a b c", il y aura 3 tours de boucles, effet probablement non désiré. je préconise la lecture dans une string comme ici, mais avec la fonction getline, qui, par défaut, lit les espaces et s'arrête au premier '\n' ;
  • une conversion alternative à l'aide d'istringstream est envisageable, mais celle présentée ici avec le bon vieux strtol du c est tout à fait ok ;
  • il manque l'inclusion des fichiers en-tête : string, iostream, cstdlib ;
  • cin et strtol sont définis dans l'espace de nom standard.



_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [C++] Lecture au clavier - Gestion d'erreur

Message  Bardack le Sam 15 Déc 2007, 22:47

cheers nfs

Bardack

Nombre de messages : 2107
Age : 32
Prénom : Florent
Statut : Ancien(ne terreur)
Localisation : Frasnes-lez-Buissenal
Date d'inscription : 18/12/2006

http://www.bardack.be

Revenir en haut Aller en bas

Re: [C++] Lecture au clavier - Gestion d'erreur

Message  KBS le Sam 15 Déc 2007, 23:47

pourquoi ne pas utiliser cin.fail()??

KBS

Nombre de messages : 8
Prénom : Soufiane
Date d'inscription : 20/11/2006

Revenir en haut Aller en bas

Re: [C++] Lecture au clavier - Gestion d'erreur

Message  nvs le Dim 16 Déc 2007, 00:55

KBS a écrit:pourquoi ne pas utiliser cin.fail()??
si tu lis dans une string, std::ios_base::failbit a peu de chance d'être levé puisqu'aucun format spécifique n'est attendu. bien entendu, cet indicateur d'état sera positionné si la lecture se fait dans un fichier dont la fin a été atteinte. et std::ios_base::badbit pourrait également être levé, mais dans ce cas, c'est un gros problème...

si tu lis directement dans un int ou un double, etc. alors, effectivement, utiliser cin.fail() est une bonne idée. mais rappelle-toi qu'une lecture d'une donnée mal formatée ne consomme pas les caractères en question. il te faut alors "sauter" les caractères non désirés du flux à l'aide de la méthode ignore(). et, pour qu'une lecture puisse être réalisée sur le flux, tu dois avant toute chose remettre le flux en bon état à l'aide de la méthode clear().

il me semble plus malin, comme PbT l'indique, de lire sans problème dans une string, puis de valider son contenu à l'aise, sans parasiter cin.

remarque que si tu es vraiment fan de fail(), clear() et ignore(), tu peux, dans ce cadre, les utiliser sur un istringstream, associé à la string qui reçoit le résultat de la lecture sur cin.

pour conclure, les choses semblent plus simples avec le modèle de fonction lexical_cast de boost, pas (encore) standard

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [C++] Lecture au clavier - Gestion d'erreur

Message  Contenu sponsorisé Aujourd'hui à 15:15


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum