web-dev-qa-db-de.com

C ++ Boost Split String

Ich verwende die boost::split - Methode, um einen String wie folgt zu teilen:

Ich stelle zunächst sicher, dass der richtige Header angegeben wird, um Zugriff auf boost::split Zu erhalten:

#include <boost/algorithm/string.hpp>

dann:

vector<string> strs;
boost::split(strs,line,boost::is_any_of("\t"));

und die Linie ist wie

"test   test2   test3"

So verarbeite ich den Ergebnis-String-Vektor:

void printstrs(vector<string> strs)
{
    for(vector<string>::iterator it = strs.begin();it!=strs.end();++it)
    {
        cout << *it << "-------";
    }

    cout << endl;
}

Aber warum in dem Ergebnis strs ich nur "test2" Und "test3" Erhalte, sollte nicht "test", "test2" Und "test3" gibt es \t (tab) in der Zeichenfolge.

Aktualisiert am 24. April 2011: Nachdem ich eine Codezeile bei printstrs geändert hatte, konnte ich die erste Zeichenfolge sehen. ich habe mich verändert

cout << *it << "-------";

zu

cout << *it << endl;

Und es schien, dass "-------" Die erste Zeichenfolge irgendwie verdeckte.

48
icn

Das Problem liegt an einer anderen Stelle in Ihrem Code, da dies funktioniert:

string line("test\ttest2\ttest3");
vector<string> strs;
boost::split(strs,line,boost::is_any_of("\t"));

cout << "* size of the vector: " << strs.size() << endl;    
for (size_t i = 0; i < strs.size(); i++)
    cout << strs[i] << endl;

und Testen Ihres Ansatzes, der einen Vektoriterator verwendet, funktioniert auch:

string line("test\ttest2\ttest3");
vector<string> strs;
boost::split(strs,line,boost::is_any_of("\t"));

cout << "* size of the vector: " << strs.size() << endl;
for (vector<string>::iterator it = strs.begin(); it != strs.end(); ++it)
{
    cout << *it << endl;
}

Wieder ist dein Problem woanders. Vielleicht ist das, was du denkst, ein \t Zeichen in der Zeichenfolge, nicht. Ich würde den Code mit Debugs füllen, indem ich die Einfügungen auf dem Vektor überprüfe, um sicherzustellen, dass alles so eingefügt wird, wie es sein soll.

Ausgabe:

* size of the vector: 3
test
test2
test3
69
karlphillip

Ich vermute, warum Sie Probleme mit der Deckung Ihres ersten Ergebnisses hatten, dass Sie tatsächlich die Eingabezeile aus einer Datei gelesen haben. Diese Zeile hatte wahrscheinlich ein\r am Ende, so dass Sie mit so etwas endeten:

-----------test2-------test3

Was passiert ist, ist das Gerät tatsächlich gedruckt:

test-------test2-------test3\r-------

Das bedeutet, dass aufgrund des Wagenrücklaufs am Ende von test3 die Bindestriche nach test3 über dem ersten Wort gedruckt wurden (und einige der vorhandenen Bindestriche zwischen test und test2, aber Sie würden das nicht bemerken, weil sie es waren schon Striche).

12
james