Voici le code:
string str; cin>>str; cout<<"first input:"<<str<<endl; getline(cin, str); cout<<"line input:"<<str<<endl;
6 Réponses :
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. P>
Le Vous pouvez également supprimer le \ n code> est laissé dans le flux d'entrée selon la manière dont
opérateur >> code> est défini pour
std :: string code>. Le
std :: string code> est rempli de caractères à partir du flux d'entrée jusqu'à ce qu'un caractère blancheur soit trouvé (dans ce cas
\ n code>), à quel point le remplissage s'arrête et l'espace blanche est maintenant le caractère suivant dans le flux d'entrée. P>
\ n code> en appelant
cin.get () code> immédiatement après
CIN >> str code>. Il y a beaucoup de façons différentes de cogner ce chat d'E / S, cependant. (Peut-être une bonne question en soi?) P>
Un meilleur moyen de se débarrasser des personnages de WhitSpace traînant serait probablement de faire STD :: Cin >> Str >> std :: ws; code>.
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 code>. 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!
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 p>
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' );
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;
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
Certains autres creusés révèlent à quel point la description peut être subtile: "extraction extraction lorsque le caractère Suivant B> est soit un espace blanche valide, soit un caractère null, ou si le fichier fin de fichier est atteint."