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

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

Marsh Posté le 06-12-2003 à 17:30:27    

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
Reply

Marsh Posté le 06-12-2003 à 17:30:27   

Reply

Marsh Posté le 06-12-2003 à 17:32:08    

isdigit ?


---------------
.
Reply

Marsh Posté le 06-12-2003 à 17:33:20    

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

Reply

Marsh Posté le 06-12-2003 à 17:51:11    

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
Reply

Marsh Posté le 06-12-2003 à 17:58:34    

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

Reply

Marsh Posté le 06-12-2003 à 18:10:27    

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
Reply

Marsh Posté le 06-12-2003 à 18:28:48    

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

Reply

Marsh Posté le 06-12-2003 à 18:43:22    

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
Reply

Marsh Posté le 06-12-2003 à 18:45:20    

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;
            }

Reply

Marsh Posté le 06-12-2003 à 19:00:19    

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
Reply

Marsh Posté le 06-12-2003 à 19:00:19   

Reply

Marsh Posté le 06-12-2003 à 19:11:19    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed