cin.getline() est en sautant d'une entrée en C++
Si j'utilise le code suivant, getline ne pas prendre la dernière entrée(pour la dernière itération de la boucle "for", c'est tout simplement l'ignore) -
int main()
{
int n;
map<string, set<string> > lst;
string c,s,c2;
cin>>n;
for(int i=0;i<n;i++)
{
getline(cin,c); //here it skips the input for last iteration
stringstream ss;
ss<<c;
bool f=1;
while(ss>>s)
{
if(f)
{
c2=s;
f=0;
}
else
lst[c2].insert(s);
}
}
for (map<string, set<string> >::const_iterator ci = lst.begin(); ci != lst.end(); ++ci)
{
cout<< (*ci).first <<" "<< (*ci).second.size() <<endl;
}
}
Pour se débarrasser d'elle, j'ai mis de la cin.ignore() après getline. Maintenant sa prise de toutes les entrées, mais je suis confronté à un nouveau problème -
#include<iostream>
#include<string>
#include<map>
#include<set>
#include<sstream>
#include<algorithm>
using namespace std;
int main()
{
int n;
map<string, set<string> > lst;
string c,s,c2;
cin>>n;
for(int i=0;i<n;i++)
{
getline(cin,c);
cin.ignore();
stringstream ss;
ss<<c;
bool f=1;
while(ss>>s)
{
if(f)
{
c2=s;
f=0;
}
else
lst[c2].insert(s);
}
}
for (map<string, set<string> >::const_iterator ci = lst.begin(); ci != lst.end(); ++ci)
{
cout<< (*ci).first <<" "<< (*ci).second.size() <<endl;
}
}
Le nouveau problème c'est que pendant la prise de c2, le premier caractère de la chaîne est supprimée. Par exemple, si je donne "l'Angleterre de Jane Doe" comme entrée pour getline, c2, je vais devenir "ngland".
Comment se débarrasser de ce problème aujourd'hui?
Le mélange
double possible de utiliser getline(cin, s) après le cin
>>
et getline
est délicate. Dans tous les cas, vous n'avez jamais case le résultat de soit, alors pourquoi voudriez-vous même que votre code de travail?(*ci).first
plus facile à lire que ci->first
double possible de utiliser getline(cin, s) après le cin
OriginalL'auteur theharshest | 2012-04-17
Vous devez vous connecter pour publier un commentaire.
Ce:
Est la lecture du nombre seulement.
Il laisse la fuite
'\n'
sur le stream.Votre premier appel à
getline()
est la lecture d'une ligne vide contenant un'\n'
Il est préférable de ne pas mélanger l'utilisation de
operator>>
etstd::getline()
. Vous devez être très prudent si vous avez quitté le saut de ligne sur le stream. Je trouve qu'il est plus facile de toujours lire ligne à ligne à partir d'un utilisateur. Ensuite d'analyser la ligne séparément.OriginalL'auteur Martin York
votre
cin.ignore()
est au mauvais endroit. getline ne laisse pas de fuite\n
caractère de saut de ligne, c'est le>>
symbole qui le fait.Ce que vous voulez probablement, c'est
cin.ignore
seulement ignore 1 personnage, vous devez ignorer tous les caractères jusqu'à la\n
caractère de saut de ligne.OriginalL'auteur Ben Cottrell
il suffit d'écrire
après votre dernière ">>" de l'opérateur.
">>" opérateur laisse un saut de ligne "\n" dans le train de bits d'entrée qui doit être effacé avant de prendre les entrées.
OriginalL'auteur Vikas Kalwani
fait le cin tampon a \n restant de la dernière cin,
donc getline prendre ce caractère \n, et obtient de licenciement;
ignorer le contenu de la mémoire tampon avant getline...
cin.ignore();
getling(cin, string_name);
//elle travaillera en douceur
OriginalL'auteur Rajeev