10
votes

Problème d'utilisation de CIN deux fois

Voici le code:

string str;
cin>>str;
cout<<"first input:"<<str<<endl;
getline(cin, str);
cout<<"line input:"<<str<<endl;


1 commentaires

Certains autres creusés révèlent à quel point la description peut être subtile: "extraction extraction lorsque le caractère Suivant est soit un espace blanche valide, soit un caractère null, ou si le fichier fin de fichier est atteint."


6 Réponses :


2
votes

Par défaut, l'opérateur d'insertion de flux se lit jusqu'à ce qu'il voit des espaces. Votre premier appel n'est pas de retour avant de voir un espace, une onglet, une nouvelle ligne, etc. Puis le personnage suivant doit être consommé afin de pouvoir accéder au prochain.


0 commentaires

7
votes

Le \ n est laissé dans le flux d'entrée selon la manière dont opérateur >> est défini pour std :: string . Le std :: string est rempli de caractères à partir du flux d'entrée jusqu'à ce qu'un caractère blancheur soit trouvé (dans ce cas \ n ), à quel point le remplissage s'arrête et l'espace blanche est maintenant le caractère suivant dans le flux d'entrée.

Vous pouvez également supprimer le \ n en appelant cin.get () immédiatement après CIN >> str . Il y a beaucoup de façons différentes de cogner ce chat d'E / S, cependant. (Peut-être une bonne question en soi?)


2 commentaires

Un meilleur moyen de se débarrasser des personnages de WhitSpace traînant serait probablement de faire STD :: Cin >> Str >> std :: ws; .


Exécutez quelques tests, réalisant que ce n'est pas le problème de la manière dont il est défini pour std :: string . En fait, opérateur >> laisse la nouvelle ligne dans le flux, quelle que soit la variable la suivante. Mais merci de commencer la discussion de se débarrasser de l'espace blanc!



0
votes

Bonne révision qui explique certaines des raisons pour lesquelles vous courez dans cette Problème, principalement en raison du comportement des types d'entrée et que vous les mélangez


0 commentaires

2
votes

Comme d'autres l'ont dit, le problème est que la nouvelle ligne est laissée à partir de la première extraction. Une solution que je fais est de supprimer tous les caractères de gauche dans le flux:

std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );


0 commentaires

2
votes

Je recommande généralement de faire une entrée orientée ligne de STD :: Cin. Donc, votre code pourrait ressembler à quelque chose comme ceci:

string str;
int val;
// Read an entire line and parse an integer from it
{
    string line;
    getline(cin, line);
    istringstream iss(line);
    iss >> val;
}
cout<<"first input:"<<val<<endl;
getline(cin, str);
cout<<"line input:"<<str<<endl;


0 commentaires

0
votes

Recherche également la solution la plus appropriée. La mise en œuvre de cet opérateur pourrait produire des problèmes. Et n'est pas toujours acceptable de lire une ligne entière ou de ne pas mélanger différents types dans une ligne d'entrée.

Pour résoudre le problème, lorsque vous souhaitez lire des données de CIN code>, et ne sais pas si Les espaces blancs ont été correctement extraits après la dernière opération d'entrée, vous pouvez le faire comme suit: P>

 #undef max


0 commentaires