Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1415 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++] Vérification d'entrée utilisateur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Vérification d'entrée utilisateur

n°584585
Le Veilleu​r
Posté le 06-12-2003 à 17:30:27  profilanswer
 

Bonjour,
 
J'ai un projet en C++ mode console à faire pour mes cours ;) C'est une simulation d'une bataille (jeu de carte, avec x joueurs, x paquets de cartes et etc)
 
J'ai fini ce projet, mais je dois vérifier les entrées utilisateurs. l'utilisateur doit entrée le nombre de joueur, donc un int, mais je voudrais vérifier s'il ne rentre pas des caractéres à la place, (ce qui ferait planter le  programme).
 
Merci :)


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
mood
Publicité
Posté le 06-12-2003 à 17:30:27  profilanswer
 

n°584588
didier1809
${citation_perso}
Posté le 06-12-2003 à 17:32:08  profilanswer
 

isdigit ?


---------------
.
n°584589
Taz
bisounours-codeur
Posté le 06-12-2003 à 17:33:20  profilanswer
 

ce qui ne ferait pas planter le programme
 
en règle général, de simple
 
if(cin >> i) suffisent
 
 
poru la deuxième fois

Code :
  1. #include <iostream>
  2.   #include <limits>
  3.   #include <sstream>
  4.   #include <string>
  5.  
  6.   using namespace std;
  7.  
  8.   int main()
  9.   {
  10.    
  11.       int i;
  12.      
  13.       for( ; ; )
  14.         {
  15.             cout << "1) saisissez un entier : " << flush;
  16.            
  17.             if( cin >> i )
  18.        {
  19.            break;
  20.        }
  21.             else if(cin.bad())
  22.        {
  23.            cerr << "Erreur d\'E/S" << endl;
  24.            return 1;
  25.        }
  26.             else if (cin.eof())
  27.        {
  28.            cout << endl << "EOF, Bye" << endl;
  29.            return 0;
  30.        }
  31.             else
  32.        {
  33.            cin.clear();
  34.            cin.ignore(numeric_limits<int>::max(), '\n');
  35.        }   
  36.         }
  37.    
  38.       cout << "1) voila l'entier : " << i << endl;
  39.    
  40.       cin.ignore(numeric_limits<int>::max(), '\n');
  41.    
  42.       for( ; ; )
  43.         {
  44.      
  45.             cout << "2) saisissez un entier : " << flush;
  46.      
  47.             string s;
  48.      
  49.             if(getline(cin, s))
  50.        {
  51.            istringstream is(s);
  52.        
  53.            if( is >> i )
  54.              {
  55.                  break;
  56.              }
  57.        }
  58.             else if(cin.bad())
  59.        {
  60.            cerr << "Erreur d\'E/S" << endl;
  61.            return 1;
  62.        }
  63.             else if (cin.eof())
  64.        {
  65.            cout << endl << "EOF, Bye" << endl;
  66.            return 0;
  67.        }
  68.         }
  69.          
  70.      
  71.       cout << "2) voila l'entier : " << i << endl;
  72.    
  73.   }


 
tu fais ça à la sauce template et tu peux lire ce que tu veux

n°584594
Le Veilleu​r
Posté le 06-12-2003 à 17:51:11  profilanswer
 

Merci de vos réponses,
 
le cin.bad() n'a pas l'air de bien marcher :(
 
ca marche comme ceci

Code :
  1. char test[20];
  2. do
  3. {
  4.   cout << "Nombre de paquet(s) de 52 cartes [Mini. 1carte/joueur] : ";
  5.   cin >> test;
  6.   cout << endl;
  7.   }while((isdigit( * test)==0) && nbCartes<nbJoueurs);
  8.   nbPaquets=atoi(test);


 
Mais je trouve pas ca génial


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
n°584597
Taz
bisounours-codeur
Posté le 06-12-2003 à 17:58:34  profilanswer
 

tu te fiches de qui ? un char *, un dépassement de capacité, l'obsolète et non-fonctionnel atoi ?
je crois que tu ferais bien d'examiner mon code un peu plus en détail quittte à te documenter sur les fonctions membres

n°584602
Le Veilleu​r
Posté le 06-12-2003 à 18:10:27  profilanswer
 

Je fais ca

Code :
  1. do{
  2. cout << "Nombre de joueurs [Mini. 2] : " ;
  3. // cin >> nbJoueurs;
  4. string s;
  5. if(getline(cin, s))
  6.    {
  7.     istringstream is(s);
  8.     if( is >> nbJoueurs )
  9.       {
  10.        break;
  11.       }
  12.     }
  13.   else if(cin.bad())
  14.         {
  15.          cerr << "Erreur d\'E/S" << endl;
  16. system("pause" );
  17.         }
  18. }while(nbJoueurs < 2);


 
Et je rentre des lettes et non  des chiffres, et il ne pretend pas s'arreter :(


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
n°584609
Taz
bisounours-codeur
Posté le 06-12-2003 à 18:28:48  profilanswer
 

Taz a écrit :

tu te fiches de qui ? un char *, un dépassement de capacité, l'obsolète et non-fonctionnel atoi ?
je crois que tu ferais bien d'examiner mon code un peu plus en détail quittte à te documenter sur les fonctions membres

[:quoted]avec ce morceau de code, tant qu'il a pas réussi à extraire un int, il lira ligne après ligne

n°584617
Le Veilleu​r
Posté le 06-12-2003 à 18:43:22  profilanswer
 

Code :
  1. do{
  2. cout << "Nombre de joueurs [Mini. 2] : " ;
  3. if( !(cin >> nbJoueurs) )
  4.   {cout << "Erreur entree/sortie" << endl; inOk=false;
  5.   }
  6. else
  7.   {
  8.    inOk=true;
  9.   }
  10. }while((nbJoueurs < 2) && (inOk==false));


 
Voilà ce que je teste, je voudrais que si l'utilsateur rentre un autre inférieur à deux, il lui redemande un chiffre, si l'utilisateur rentre autre chose que des choses, qu'il lui redemande le nombre de joueur.
 
Là qd le nb de joueurs est correcte et en chiffre ca passe, mais si je rentre des lettres c'est mort :(  
 
merci ;)


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
n°584619
Taz
bisounours-codeur
Posté le 06-12-2003 à 18:45:20  profilanswer
 

et ben tu reprends mes codes d'avant et tu transformes
 
     if( is >> nbJoueurs )
            {
               break;
            }
 
 
en
 
 
     if( is >> nbJoueurs && nbJoueurs < 2)
            {
               // par ici la sortie, on a une donnée correcte
               break;
            }

n°584622
Le Veilleu​r
Posté le 06-12-2003 à 19:00:19  profilanswer
 

merci :)
 
Je viens de faire comme ca
 

Code :
  1. while(inOk==false)
  2. {
  3.   cout << "Nombre de joueurs [Mini. 2] : " ;
  4.   string s;
  5.    if(getline(cin, s))
  6.       {
  7.        istringstream is(s);
  8.        if( is >> nbJoueurs && nbJoueurs > 1)
  9.          inOk=true;
  10.       }
  11.   }


 
et ca marche bien :) maintenant je dois vérifier s'il ne depasse pas la capacité d'un int aussi


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
mood
Publicité
Posté le 06-12-2003 à 19:00:19  profilanswer
 

n°584625
Taz
bisounours-codeur
Posté le 06-12-2003 à 19:11:19  profilanswer
 

c'est mauvais. le booléen est inutile, tu ne gères aucune erreur
 
 

Code :
  1. for( ; ; )
  2.             {
  3.            
  4.                   cout << "2) saisissez un entier : " << flush;
  5.            
  6.                   string s;
  7.            
  8.                   if(getline(cin, s))
  9.              {
  10.                    istringstream is(s);
  11.                
  12.                    if( is >> i  && i>1)
  13.                      {
  14.                            break;
  15.                      }
  16.              }
  17.                   else if(cin.bad())
  18.              {
  19.                    cerr << "Erreur d\'E/S" << endl;
  20.                    return 1;
  21.              }
  22.                   else if (cin.eof())
  23.              {
  24.                    cout << endl << "EOF, Bye" << endl;
  25.                    return 0;
  26.              }
  27.             }

c'est pourtant pas compliqué !
 
je montre 2 techniques et les deux sont sures et garantissent que  si une erreur se produit, elle sera détectée.
 
mais par pitié vire ce pauvre booléen qui perd d'ailleurs toute ca cridibilité avec le while(inOk==false)
 
si tu veux gérer les E/S suit ma méthode, sinon ça ne sert à rien. soit on gère les erreurs, soit on ne gère pas. ton programme, il peut ce mettre à boucler indéfininment sans que tu comprennes pourquoi
 
edit : la méthode avec les stringstream étant moins bonne puisqu'on mémorise tous les caractères dont justement on n'a cure


Message édité par Taz le 06-12-2003 à 19:24:41

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++] Vérification d'entrée utilisateur

 

Sujets relatifs
[CMD] Saisie de parametre par l'utilisateur ?[PHP] verification d'email - expressions régulieres
verification des champs d'un formulaire pour l'envoie d'un email[VB] utilisateur bdd oracle
[Windows] Rendre un dossier windows invisible à l'utilisateur...[vba autocad] fenetre ancrable et laisser la main a l'utilisateur
formulaire - deux boutons submit >> touche entrée[HTML/JS] Afficher le nombre d'utilisateur connecté sur le site
[C++] Récupérer une chaine saisie par l'utilisateur : cin, getline... Exception definie par l utilisateur sous ORACLE (+Delphi) [RESOLU]
Plus de sujets relatifs à : [C++] Vérification d'entrée utilisateur


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR