Problème de saisie avec cin (c++)

Signaler
Messages postés
44
Date d'inscription
dimanche 2 mai 2004
Statut
Membre
Dernière intervention
15 avril 2005
-
Messages postés
59
Date d'inscription
lundi 21 août 2006
Statut
Membre
Dernière intervention
17 juillet 2009
-
Salut,
Je doit programmer un petit jeu comme projet de fin de semestre.
A plusieurs reprises, je demande a l'utilisateur de saisir un entier
entre 3 et 15.

Je fait donc une boucle:
do{
cout << "Entrez un entier entre 3 et 15 : ";
cin >> entier;
}
while (entier < 3 || entier > 15);

Mon problème est que quand l'utilisateur entre autre chose qu'un nombre... la boucle s'éxecute indéfiniment et ne ma laisse plus entrer quelque chose!

voila, si quelqu'un connaît une astuce, merci d'avance!

Voila, voila...
@+ Syst3mOf@Xav

Voir Redmond et mourir !

10 réponses

Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011

#include 
#include <stdio.h>

using namespace std;

int main(int argc, char **argv) {

ios::sync_with_stdio(); // partage des meme flux pr I/O en C et en C++

int entier;

do{

cout << "\rEntrez un entier entre 3 et 15 : ";
scanf("%d", &entier);

 }
while (entier < 3 || entier > 15);

} // fin main() ...


Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005

"ios::sync_with_stdio(); // partage des meme flux pr I/O en C et en C++"

non, ça permet d'utiliser les memes tampons d'E/S, que tu utilises la lib C, ou stream (C++).
Il ne faut pas utiliser ça sans bonnes raisons ! on fait du C ou du C++, pas les deux.
En tout cas, ça ne résoudra pas le probleme.
Il faut tester l'état du flux avec cin.good(), cin.fail(), ... Si tu attends un entier et que tu rentres une chaine de caractere, le flux sera corrompu comme tu pourras t'en apercevoir...
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011

mister je c tt...sache que :

""ios::sync_with_stdio(); // partage des meme flux pr I/O en C et en C++"

non, ça permet d'utiliser les memes tampons d'E/S, que tu utilises la lib C, ou stream (C++)."

<<< c'est a ça que je faisait allusion, désolé si je me suis mal exprimé!! je m'excuse d'avoir posté ici!! au revoir!!! ++

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005

"<<< c'est a ça que je faisait allusion, désolé si je me suis mal exprimé!! "
OK, c'est moi qui m'excuse alors. Mais c'etait pas clair et de plus je n'aime pas ce genre de programmation C/C++ mélangé, c'est tout.
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011

lol plu_plus_fab moi nan plu, mais bon parfois, j'opte pour cette solution quand même, ça m'evite de me fouler ^^ surtout que le but de l'application de réside pas la dedans, et si le code est court, on s'en sort encore! mdr

Gendal67, Dev-C++ 4.9.9.1, J'adore cppfrance!! :-))
Messages postés
44
Date d'inscription
dimanche 2 mai 2004
Statut
Membre
Dernière intervention
15 avril 2005

Merci d'avoir repondu, en cherchant des infos sur cin.good(), j'ai trouvé cin.get()... pour moi c'est plus simple.

J'ai essayé avec cin.fail(), mais il n'existe pas de fonction pour vider le flux cin, et donc je sais que la valeur n'est pas bonne, mais ca plante quand même car le caractère faux reste dans le flux. ( = boucle infinie) :(

Je fait une boucle qui récupère un à un les caractère du tampon, leur retire 48 (la valeur ACSII de la touche '0') et les additionne en multipliant à chaque fois le résultat temporaire par dix; Jusqu'à ce que j'arrive au caractère '\n' (la touche ENTREE).

Et ca me donne dans tous les cas un entier! :o)

Voila, voila...
@+ Syst3mOf@Xav

Voir Redmond et mourir !
Messages postés
868
Date d'inscription
dimanche 26 décembre 2004
Statut
Membre
Dernière intervention
26 février 2008
1
Si t'a envie de le faire à l'arrache, tu met une condition qui dit que si le nombre est strictement supérieur à 15 ou strictement inférieur à 3 alors tu fais revenir au début. Si ça peut te donner d'autres solutions (je te laisse trouver le code tous seul )... Ca marche, c'est simple mais c'est un peu naze. Le code de Gendal67 est pas mal (et même très bien).
Messages postés
44
Date d'inscription
dimanche 2 mai 2004
Statut
Membre
Dernière intervention
15 avril 2005

En fait, le problème n'était pas sur les valeurs entrées, mais sur leur type.
Si l'utilisateur rentrait "a" ou la valeur de la touche F10 (par exemple), ça me
fait une boucle sans fin... :( (le type demandé est int)

Avec cin.get() aucun problème, mais il faut reconstruire le nombre et
vérifier que les touches entrées ne représentent que des chiffres. Bref c'est
galére quoi...

Voila, voila...
@+ Syst3mOf@Xav

Voir Redmond et mourir !
Messages postés
868
Date d'inscription
dimanche 26 décembre 2004
Statut
Membre
Dernière intervention
26 février 2008
1
Ah ! D'accord ! C'est que c'est vraiment galère !
Messages postés
59
Date d'inscription
lundi 21 août 2006
Statut
Membre
Dernière intervention
17 juillet 2009

Si ca t'interesse toujours, la réponse est la : http://www.cppfrance.com/codes/FONCTION-REMISE-ETAT-FLUX-ENTREE-STANDARD-CIN-CORROMPU_9923.aspx

<hr size="2" width="100%" />*Les fautes d'orthographes jointes à la présente missive, sont la propriété exclusive de l'auteur. Toute copie illégale pourra être passive de poursuites judiciaires, et soumises à des peines et san