OVH Cloud OVH Cloud

std::getline ?

10 réponses
Avatar
Nicolas Aunai
salut,


comment fonctionne std::getline ?

je fais :

string s;

do
{
cout << "Quel des relancer ? => ";
getline(cin,s);
}
while(!verif_string(s));
cout << endl << "tu relances : " << s <<endl;


verif_string() renvoie true si la chaine est valide, false sinon. le
problème est que dans ce petit bout de code, ça passe une première fois
dans verif_string() avant même d'avoir qqch dans 's' !

normalement ça ne devrait pas... ça n'est qu'au second passage dans la
boucle que je peux taper qqch... comme si ça faisait un getline dans le
vide...

--
Nico,
http://astrosurf.com/nicoastro
messenger : nicolas_aunai@hotmail.com

10 réponses

Avatar
Benoit Rousseau
Nicolas Aunai wrote:
salut,


comment fonctionne std::getline ?

je fais :

string s;

do
{
cout << "Quel des relancer ? => ";
getline(cin,s);
}
while(!verif_string(s));
cout << endl << "tu relances : " << s <<endl;


verif_string() renvoie true si la chaine est valide, false sinon. le
problème est que dans ce petit bout de code, ça passe une première fois
dans verif_string() avant même d'avoir qqch dans 's' !

normalement ça ne devrait pas... ça n'est qu'au second passage dans la
boucle que je peux taper qqch... comme si ça faisait un getline dans le
vide...

getline ne prend pas le n en fin ligne...

il faut faire un get sur cin après...

--
--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/

Avatar
Nicolas Aunai


getline ne prend pas le n en fin ligne...
il faut faire un get sur cin après...


comment ça un "get sur cin" ?

--
Nico,
http://astrosurf.com/nicoastro
messenger :

Avatar
Benoit Rousseau
Nicolas Aunai wrote:


getline ne prend pas le n en fin ligne...
il faut faire un get sur cin après...



comment ça un "get sur cin" ?

getline(cin, s);

cin.get(); //Prendre un caractere dans cin ('n' en l'occurence)

--
--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/


Avatar
Nicolas Aunai
"Benoit Rousseau" a présenté l'énoncé suivant :


comment ça un "get sur cin" ?

getline(cin, s);

cin.get(); //Prendre un caractere dans cin ('n' en l'occurence)



beh c'est bien ce que j'avais compris en fait, mais bien que ça ne me
fait pas une itération pour rien maintenant ça n'arrive plus a capter
ma chaine :

do
{
cout << "Quel des relancer ? => ";
getline(cin,s);
cin.get();
cout << "la chaine est : " << s << endl;
}
while(!verif_string(s));
cout << endl << "tu relances : " << s <<endl;

m'affiche :

------------------------------------
Quel des relancer ? => x x x . .
la chaine est :
la chaine est FALSE !
Quel des relancer ? =>
------------------------------------

et ce indéfiniment, car il ne prend plus ma chaine...

--
Nico,
http://astrosurf.com/nicoastro
messenger :


Avatar
Nicolas Aunai
"Nicolas Aunai" avait énoncé :


do
{
cout << "Quel des relancer ? => ";
getline(cin,s);
cin.get();
cout << "la chaine est : " << s << endl;
}
while(!verif_string(s));
cout << endl << "tu relances : " << s <<endl;

m'affiche :

------------------------------------
Quel des relancer ? => x x x . .
la chaine est :
la chaine est FALSE !
Quel des relancer ? =>
------------------------------------

et ce indéfiniment, car il ne prend plus ma chaine...



d'ailleurs s'il existe une méthode plus simple et plus efficace pour
choper une chaine un peu comme fgets() en C, je suis preneur !

--
Nico,
http://astrosurf.com/nicoastro
messenger :

Avatar
Loïc Joly
Nicolas Aunai wrote:

salut,


comment fonctionne std::getline ?

je fais :

string s;

do
{
cout << "Quel des relancer ? => ";
getline(cin,s);
}
while(!verif_string(s));
cout << endl << "tu relances : " << s <<endl;


verif_string() renvoie true si la chaine est valide, false sinon. le
problème est que dans ce petit bout de code, ça passe une première fois
dans verif_string() avant même d'avoir qqch dans 's' !

normalement ça ne devrait pas... ça n'est qu'au second passage dans la
boucle que je peux taper qqch... comme si ça faisait un getline dans le
vide...


Je pense qu'il y a déjà des choses dans le tampon d'entrée. Quel est le
code d'entrée sortie précédent ?
Ce bout de programme fonctionne correctement chez moi.

--
Loïc

Avatar
Loïc Joly
Benoit Rousseau wrote:


getline ne prend pas le n en fin ligne...

il faut faire un get sur cin après...


???

21.3.7.9
Effects: Begins by constructing a sentry object k as if by typename
basic_istream<charT,traits>::sentry k( is, true). If bool( k) is true,
it calls str.erase() and then extracts characters from is and appends
them to str as if by calling str.append(1, c) until any of the following
occurs:
-- endoffile occurs on the input sequence (in which case, the getline
function calls is.setstate(ios_base::eofbit)).
-- c == delimfor the next available input character c (in which case, c
is extracted but not appended) (27.4.4.3)
-- str.max_size() characters are stored (in which case, the function
calls is.setstate(ios_base::failbit) (27.4.4.3)

--
Loïc


Avatar
Nicolas Aunai


Je pense qu'il y a déjà des choses dans le tampon d'entrée. Quel est le code
d'entrée sortie précédent ?
Ce bout de programme fonctionne correctement chez moi.



il s'agit de ce code, dans une autre fonction...

char c;

cout<<"Relancer ? (O/N)"<<endl;
do
{
cout<<"=> ";
cin >> c;
cout<<endl;
}
while((c != 'O') && (c!='N'));

--
Nico,
http://astrosurf.com/nicoastro
messenger :

Avatar
Benoit Rousseau
Loïc Joly wrote:
Benoit Rousseau wrote:


getline ne prend pas le n en fin ligne...

il faut faire un get sur cin après...



???

21.3.7.9
Effects: Begins by constructing a sentry object k as if by typename
basic_istream<charT,traits>::sentry k( is, true). If bool( k) is true,
it calls str.erase() and then extracts characters from is and appends
them to str as if by calling str.append(1, c) until any of the following
occurs:
-- endoffile occurs on the input sequence (in which case, the getline
function calls is.setstate(ios_base::eofbit)).
-- c == delimfor the next available input character c (in which case, c
is extracted but not appended) (27.4.4.3)
-- str.max_size() characters are stored (in which case, the function
calls is.setstate(ios_base::failbit) (27.4.4.3)

C'est en effet avec les get( char*, int, delim ) que j'avais eu ce

problème de delimiteur qui reste dans le flux... toutes mes excuses

--
--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/



Avatar
Loïc Joly
Nicolas Aunai wrote:



Je pense qu'il y a déjà des choses dans le tampon d'entrée. Quel est
le code d'entrée sortie précédent ?
Ce bout de programme fonctionne correctement chez moi.




il s'agit de ce code, dans une autre fonction...

char c;

cout<<"Relancer ? (O/N)"<<endl;
do
{
cout<<"=> ";
cin >> c;
cout<<endl;
}
while((c != 'O') && (c!='N'));


C'est effectivement ça : Tu lis un char, mais il reste encore le saut de
ligne (ou tout ce que l'utilisateur a tapé d'autre avant de valider)
dans le flux d'entrée. Essaye par exemple de taper "O42" à la première
question, et tu verras que s vaudra "42".
Un des moyens de vider le tampon pour repartir sur de meilleurs bases
consiste à ajouter cin.ignore() après le premier code.

--
Loïc