salut tout le monde
voici le code :
do{ cout << "nbr de ligne : "; cin>> nbl; cout << "nbr de colonne : ";cin >> nbc ; cout << "nbr de couleur : "; cin >> nbcoul ; }while((is_int(nbl) <5 || is_int(nbl)>14) || (is_int(nbc) <5 || is_int(nbc)>14) || (is_int(nbcoul) <3 || is_int(nbcoul)>7)) ;
int VueConsole::is_int( const string & Str ) { // créer un flux à partir de la chaîne donnée istringstream iss( Str ); // créer un objet temporaire pour la conversion int tmp; // tenter la conversion et // vérifier qu'il ne reste plus rien dans la chaîne if( ( iss >> tmp ) && ( iss.eof()) ) return tmp; else return -1; }
au fait je demande a l utilisateur de mettre un nb de ligne de colonne et de couleur
mais mon soucis est que lorqu'il tape:
nbr de ligne : 5 5 nbr de colonne : nbr de couleur :
il considere que le 2eme argument fait partie du 2e cin
donc pour lui il considere un espace comme un delimiteur
comment puis-je faire pour que chaque demande se fasse sur une ligne pour chacunes
j'ai deja essayer getline(cin,nbl); mais au niveau de la methode is_int
si je met 5 dans le string en parametre il me retourne false alors que c est bien possible de le convertir en entier.
Cordialement.
En effet les flux du C++ lisent une ligne entière quand tu fais cin>> nbl;
En effet c'est spécifié comme ça dans le standard.
Ben tu l'as presque fait déjà. Au lieu de tester eof, simplmeent tu laisse tomber à la trappe ce qui traîne dna sle reste du stringstream. Ah et aussi, il est bon de tester fail() pour savoir si c'est bien un entier qui est extrait.
Exemple
si tu donnes
1 -> tu récupères 1
1 2 -> tu récupères seulement 1
a -> on te demande de ressaisir
a1 -> on de demande de ressaisir
a 1 -> tu récupères 1 (attention :) )