2011-04-20 18 views
38

estoy usando el método boost::split para dividir una cadena como esta divisiónC++ Boost cadena

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

y la línea es como

"test test2 test3" 

Esta es la forma en que consumo el vector de cadena de resultado:

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

    cout << endl; 
} 

Pero por qué en el resultado strs solo me dan "test2" y "test3", no deben ser "test", "test2" y "test3", hay \t (pestaña) en la cuerda.

Actualizado el 24/04/2011: Parece que después de haber cambiado una línea de código en printstrs puedo ver la primera cadena. He cambiado

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

a

cout << *it << endl; 

y parecía "-------" cubierto la primera cadena de alguna manera.

+4

Muestra cómo trabajas con el vector.Supongo que el problema está ahí. –

+9

'boost :: is_any_of (" \ t ")' es menos eficiente que '[] (char c) {return c == '\ t';}'. Solo quieres verificar una sola posibilidad. (No tengo idea de por qué no hay 'impulso: es ('\ t')') – MSalters

+0

¿Qué significa el código en @MSalters comentar? ¿Cómo uso ese código para sustituir 'boost :: is_any_of()'? –

Respuesta

52

El problema está en otra parte de su código, porque esto funciona:

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; 

y probar su método, que utiliza un iterador vector también funciona:

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

Una vez más, el problema está en alguna parte más. Tal vez lo que piensas es un personaje \t en la cadena, no lo es. Completaría el código con depuraciones, comenzando por monitorear las inserciones en el vector para asegurarme de que todo se inserta de la forma que se supone que debe ser.

Salida:

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

No hay nada más que podamos hacer por usted si no comparte un ejemplo mínimo que reproduzca el problema al que se enfrenta. Recuerde: EJEMPLO MÍNIMO, no su aplicación completa. – karlphillip

+0

@icn ¿Alguna actualización de su parte? – karlphillip

+0

gracias. parece que cambié cout << * it << "-------" to cout << * it << endl; Puedo ver la primera cadena. No estoy seguro por qué, parece que "-------" cubrió la primera cadena – icn

10

Mi mejor conjetura en qué tuvo problemas con la cobertura de su ----- primer resultado es que en realidad se lee la línea de entrada de un archivo. Esa línea probablemente tenía un \ r en el extremo de modo que terminó con algo como esto:

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

Lo que pasa es que la máquina impresa realmente esto:

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

Eso significa que, debido del retorno de carro al final de test3, que los guiones posteriores a test3 se imprimieron sobre la primera palabra (y algunos de los guiones existentes entre test y test2 pero no se daría cuenta de eso porque ya eran guiones).