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

SystemOfAXav Messages postés 44 Date d'inscription dimanche 2 mai 2004 Statut Membre Dernière intervention 15 avril 2005 - 22 déc. 2004 à 13:15
Zakata Messages postés 59 Date d'inscription lundi 21 août 2006 Statut Membre Dernière intervention 17 juillet 2009 - 13 oct. 2007 à 01:39
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

Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
22 déc. 2004 à 14:54
#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!! :-))
0
plus_plus_fab Messages postés 232 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 8 janvier 2005
22 déc. 2004 à 15:27
"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...
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
22 déc. 2004 à 16:44
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!! :-))
0
plus_plus_fab Messages postés 232 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 8 janvier 2005
22 déc. 2004 à 17:34
"<<< 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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
25 déc. 2004 à 23:32
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!! :-))
0
SystemOfAXav Messages postés 44 Date d'inscription dimanche 2 mai 2004 Statut Membre Dernière intervention 15 avril 2005
26 déc. 2004 à 21:10
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 !
0
cs_algori Messages postés 868 Date d'inscription dimanche 26 décembre 2004 Statut Membre Dernière intervention 26 février 2008 1
25 janv. 2005 à 20:22
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).
0
SystemOfAXav Messages postés 44 Date d'inscription dimanche 2 mai 2004 Statut Membre Dernière intervention 15 avril 2005
26 janv. 2005 à 00:14
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 !
0
cs_algori Messages postés 868 Date d'inscription dimanche 26 décembre 2004 Statut Membre Dernière intervention 26 février 2008 1
26 janv. 2005 à 13:44
Ah ! D'accord ! C'est que c'est vraiment galère !
0
Zakata Messages postés 59 Date d'inscription lundi 21 août 2006 Statut Membre Dernière intervention 17 juillet 2009
13 oct. 2007 à 01:39
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
0
Rejoignez-nous