web-dev-qa-db-fra.com

c ++ boost split string

J'utilise le boost::split méthode pour diviser une chaîne comme ceci:

Je m'assure d'abord d'inclure le bon en-tête pour avoir accès à boost::split:

#include <boost/algorithm/string.hpp>

puis:

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

et la ligne est comme

"test   test2   test3"

Voici comment je consomme le vecteur de résultat:

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

    cout << endl;
}

Mais pourquoi dans le résultat strs je ne reçois que "test2" et "test3", ne devrait pas être "test", "test2" et "test3", il y a \t (tabulation) dans la chaîne.

Mise à jour le 24 avril 2011: Il semblait qu'après avoir changé une ligne de code en printstrs je peux voir la première chaîne. j'ai changé

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

à

cout << *it << endl;

Et il semblait que "-------" couvrait la première chaîne d'une manière ou d'une autre.

48
icn

Le problème se situe ailleurs dans votre code, car cela fonctionne:

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;

et tester votre approche, qui utilise un itérateur vectoriel, fonctionne également:

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;
}

Encore une fois, votre problème est ailleurs. Peut-être que ce que vous pensez est un \t caractère sur la chaîne, n'est pas. Je voudrais remplir le code avec des debugs, en commençant par contrôler les insertions sur le vecteur afin de m'assurer que tout est inséré comme il est supposé être.

Sortie:

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

Je suppose que vous avez lu la ligne de saisie à partir d’un fichier. Cette ligne avait probablement un\r à la fin et vous vous êtes retrouvé avec quelque chose comme ceci:

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

Qu'est-il arrivé est la machine réellement imprimée ceci:

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

Cela signifie que, à cause du retour chariot à la fin de test3, les tirets après test3 ont été imprimés par-dessus le premier mot (et quelques tirets existants entre test et test2, mais vous ne le remarqueriez pas. déjà des tirets).

12
james