2016-11-09 2 views
0

Comment ce programme devrait fonctionner:C++: lecture des entrées multiples pour finir de la ligne

Entrez 4 mots:

cela est mauvais

entrée Bad.

et

Entrez 4 mots:

bonjour vous l'aimez

Bonne entrée.

Comment je l'ai essayé:

#include <iostream> 
#include <string> 

using namespace std; 

int main(void) { 
    cout << "Enter 4 words:" << endl; 
    string a, b, c, d; 
    cin >> a >> b >> c >> d; 
} 

Il lit l'entrée après la fin de la ligne et je ne peux pas comprendre comment limiter seulement à une ligne. Pouvez-vous s'il vous plaît me signaler quelle fonction je devrais utiliser? Je serai très reconnaissant pour chaque réponse.

Merci à tous!

+5

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. –

Répondre

1

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++.

0

Vous devez utiliser la commande suivante: std::getline() l'espace Cette ignorer éventuelle en tant que chaîne de terminaison de devis et vous pouvez stocker la valeur dans une variable, voir à quel point les mots sont à l'intérieur que. Exemple: std::getline (std::cin,name);