2011-04-20 3 views
38

J'utilise la méthode boost::split pour diviser une chaîne comme ceci:C++ boost Éclate une chaîne

je d'abord vous assurer d'inclure l'en-tête correct d'avoir accès à boost::split:

#include <boost/algorithm/string.hpp> 

alors:

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

et la ligne est comme

"test test2 test3" 

Voilà comment je consume le vecteur de chaîne 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 devraient pas être "test", "test2" et "test3", il y a \t (onglet) en la chaîne.

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

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

à

cout << *it << endl; 

Et il me semblait "-------" couvert la première chaîne en quelque sorte.

+4

Montrez comment vous travaillez avec le vecteur.Je suppose que le problème est là. –

+9

'boost :: is_any_of (" \ t ")' est moins efficace que '[] (char c) {return c == '\ t';}'. Vous voulez juste vérifier une seule possibilité. (Aucune raison pour laquelle il n'y a pas de boost: is ('\ t') ') – MSalters

+0

Que signifie le commentaire dans @MSalters? Comment puis-je utiliser ce code pour substituer 'boost :: is_any_of()'? –

Répondre

52

Le problème est 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 vecteur iterator fonctionne aussi:

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 quelque part autre. Peut-être que ce que vous pensez est un caractère \t sur la chaîne, n'est pas. Je remplirais le code avec des débogages, en commençant par surveiller les insertions sur le vecteur pour m'assurer que tout est inséré de la façon dont il est censé être.

Sortie:

* size of the vector: 3 
test 
test2 
test3 
+2

Nous ne pouvons rien faire d'autre si vous ne partagez pas un exemple minimal qui reproduit le problème auquel vous êtes confronté. Rappelez-vous: EXEMPLE MINIMAL, pas votre application complète. – karlphillip

+0

@icn Des mises à jour de votre côté? – karlphillip

+0

merci. il semblait que je changeais cout << * it << "-------" à cout << * it << endl; Je peux voir la première chaîne. Je ne sais pas pourquoi, il semble "-------" couvert la première chaîne – icn

10

Ma meilleure estimation pourquoi vous avez eu des problèmes avec le ----- couvrant votre premier résultat est que vous lisez en fait la ligne d'entrée d'un fichier. Cette ligne avait probablement \ r sur la fin afin que vous retrouviez avec quelque chose comme ceci:

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

Qu'est-il arrivé est la machine fait imprimer ceci:

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

Cela signifie, parce que du retour de chariot à la fin de test3, que les tirets après test3 ont été imprimés sur le dessus du premier mot (et quelques uns des tirets existants entre test et test2 mais vous ne le remarquerez pas parce qu'ils étaient déjà des tirets).