Par défaut, l'opérateur d'extraction de flux (l'opérateur >>
) appliqué aux chaînes va ignorer tous les espaces. Si vous tapez A B C
, puis une nouvelle ligne, puis D E F
, puis essayez de lire les chaînes une à la fois en utilisant l'opérateur d'extraction de flux, vous obtiendrez les chaînes "A", "B", "C", "D", " E ", et" F "sans espace et sans saut de ligne.
Si vous voulez lire un tas de cordes jusqu'à ce que vous frappez une nouvelle ligne, vous pouvez envisager d'utiliser std::getline
pour lire une ligne de texte, puis utilisez un std::istringstream
pour tokenizer il:
#include <sstream>
/* Read a full line from the user. */
std::string line;
if (!getline(std::cin, line)) {
// Handle an error
}
/* Tokenize it. */
std::istringstream tokenizer(line);
for (std::string token; tokenizer >> token;) {
// Do something with the string token
}
Comme une note - dans votre code d'origine, vous avez une boucle qui ressemble généralement à ceci:
string toRead;
while (allIsGoodFor(toRead)) {
cin >> toRead;
// do something with toRead;
}
cette approche, en général, ne fonctionne pas parce qu'il continuera dans la boucle une fois de trop. Plus précisément, une fois que vous avez lu une entrée qui provoque la condition à false, la boucle continuera à traiter ce que vous avez lu jusqu'à présent. Il est sans doute une meilleure idée de faire quelque chose comme ceci:
while (cin >> toRead && allIsGoodFor(toRead)) {
do something with toRead;
}
Downvoter: Ma logique incorrecte ici? Y a-t-il quelque chose que je peux faire pour améliorer cette réponse? – templatetypedef
Ce n'est pas comme ça que vous écrivez des boucles d'entrée. –
J'aime cette année (donc j'ai donné +1), mais s'il vous plaît nettoyer «certaines conditions ne sont pas vraies à propos de lire». – Charles