std::getline()
doit être utilisé lorsque l'entrée attendue du programme provient d'un terminal interactif.
C'est ce que fait std::getline()
: il lit le texte jusqu'au caractère de nouvelle ligne. operator>>
ne fait pas cela, c'est ce que fait std::getline()
, et c'est ce qui devrait être utilisé pour traiter une ligne de texte tapé. Utilisez le bon outil, pour le bon travail.
Malheureusement, de nombreux livres et tutoriels C++ introduisent >>
trop tôt, avant d'introduire std::getline()
, et l'utiliser dans leurs exemples, tout simplement parce qu'il est plus facile et plus commode d'avoir >>
gérer la conversion de type de données requises. Malheureusement, cela se traduit par un mauvais état d'esprit s'installer, où >>
est considéré comme le choix automatique pour le traitement des entrées interactives. Ce n'est pas. L'approche correcte est d'utiliser std::getline()
. Puis, si nécessaire, construisez un std::istringstream
et utilisez-le pour gérer les conversions de type à partir de l'entrée entrée. Non seulement cela résout le problème immédiat, mais il résout également le problème de l'entrée impossible à mettre std::cin
dans un état d'échec, avec toutes les tentatives de conversions ultérieures échouées aussi - c'est un autre piège commun.
, utilisez std::getline()
, d'abord:
#include <string>
#include <iostream>
#include <sstream>
#include <vector>
int main(void) {
std::cout << "Enter 4 words:" << endl;
std::string line;
std::getline(std::cin, line);
Et maintenant, une fois que la ligne de texte est saisi, il peut être converti en un std::istringstream
:
std::istringstream i(line);
Suivi par une boucle à plusieurs reprises invoquer >>
afin de compter les mots dans cette ligne. Cette partie vous pouvez finir vous-même.
P.S.Un autre piège commun est using namespace std;
. You should not do that, as well. Les bonnes pratiques de programmation antérieures sont acquises, le plus facile sera la route suivante sur le chemin du gourou C++.
Connaissant [ 'std :: getline'] (http://en.cppreference.com/w/cpp/string/basic_string/getline) et [' std :: istringstream'] (http : //en.cppreference.com/w/cpp/io/basic_istringstream) devrait être utile. –