2017-01-25 2 views
1

En utilisant stringstream pour extraire des mots d'une phrase.Pourquoi std :: cout ajoute return ou newlines à ma sortie?

Une nouvelle ligne est ajoutée pour chaque mot, et je ne vois pas pourquoi; peut tu? Merci pour votre aide. Keith: ^)

#include <iostream> 
#include <sstream> 
#include <string> 
#include <vector> 
#include <algorithm> 

int main() { 
    int wordCount(9); 
    std::vector<std::string> v(wordCount); 
    std::vector<std::string>::iterator it; 
    std::string tStr; 
    std::string myStr = "the quick fox jumped over the lazy brown dogs"; 
    std::stringstream ss(myStr); 
    std::cout << "Sentence broken into vector:" << std::endl; 
    for (int i=0; i<wordCount; ++i) { 
     ss >> tStr; 
     v.push_back(tStr); 
    } 
    for (it=v.begin(); it != v.end(); ++it) 
     std::cout << *it << std::endl; 

    std::cout << std::endl; 
    return 0; 
} 

Compilation, exécution et sortie. Notez les nouvelles lignes supplémentaires.

pickledEgg $ g++ -std=c++11 -g -Og -o io2 io2.cpp 
pickledEgg $ ./io2 
Sentence broken into vector: 









the 
quick 
fox 
jumped 
over 
the 
lazy 
brown 
dogs 
+3

Ce serait un excellent moment pour utiliser un débogueur. – chris

+0

Vous n'utilisez pas 'std :: cin' n'importe où dans ce code ... – qxz

+1

vous avez créé le vecteur avec 9 chaînes vides et ensuite vous avez poussé les autres chaînes sur la fin ... la sortie correspond exactement à –

Répondre

6

Lorsque vous avez créé votre vecteur avec cette ligne std::vector<std::string> v(wordCount); vous avez créé wordCount entrées vides. Lorsque vous avez appelé push_back pour ajouter vos mots, vous avez ajouté vos mots à la fin de votre vecteur. Lorsque vous avez itéré sur votre vecteur, vous avez d'abord imprimé les entrées vides avec de nouvelles lignes, puis vos bonnes données.

+0

Oui! Je vous remercie. Bon oeil; longue journée pour moi. – kmiklas

+0

@kmiklas C'était frais dans ma mémoire à cause d'une autre question, sinon je l'aurais probablement manqué. –

4

assez simple:

//std::vector<std::string> v(wordCount); 
std::vector<std::string> v; 

Je pense que vous vouliez utiliser std::vector::reserve.

Les éléments sont stockés jointive, ce qui signifie que les éléments peuvent être accessibles non seulement par itérateurs, mais aussi en utilisant des décalages sur réguliers des pointeurs vers des éléments. Cela signifie qu'un pointeur vers un élément d'un vecteur peut être passé à n'importe quelle fonction qui attend un pointeur vers un élément d'un tableau. http://en.cppreference.com/w/cpp/container/vector

Parce que std::vector::push_back valeur dans le ajoute vecteur, ce qui provoque un changement de sa taille. Si vous traitez avec un vecteur de taille suffisamment grande, vous devriez envisager d'utiliser std::vector::reserve.

Vous pouvez voir la différence dans .

+1

Il était trop tard;) – 0Tech

+0

Vous pouvez développer la réponse et expliquer ce qui se passe exactement, il n'est donc jamais trop tard. – vsoftco