2011-03-02 7 views
47

¿La mejor manera de dividir una cadena en C++? Se puede suponer que la cadena está compuesta de palabras separadas por el delimitador ;.División de C++ std :: cadena utilizando tokens, p. Ej. ";"

Desde nuestro punto de vista de las líneas guía C no están permitidas las funciones de cadena y tampoco está permitido el uso de Boost debido a problemas de seguridad. La fuente abierta no está permitida.

La mejor solución que tengo en este momento es:

string str("denmark;sweden;india;us"); 

Por encima de str deben ser almacenados en el vector como cadenas. ¿Cómo podemos lograr esto?

Gracias por las entradas.

+1

no lo hago Creo que esto debe ser marcado como un duplicado, la otra pregunta promueve la elegancia sobre la eficiencia, con lo que no estoy de acuerdo y evito por esa misma razón. – user2462027

Respuesta

112

me parece std :: getline() es a menudo el más simple. El parámetro opcional delimitador significa que no es sólo para la lectura de "líneas":

#include <sstream> 
#include <iostream> 
#include <vector> 

using namespace std; 

int main() { 
    vector<string> strings; 
    istringstream f("denmark;sweden;india;us"); 
    string s;  
    while (getline(f, s, ';')) { 
     cout << s << endl; 
     strings.push_back(s); 
    } 
} 
+3

+1: Guau, nunca se consideró el uso de 'getline' con' istringstream'. –

+0

Aquí hay muchas preguntas similares, pero este enfoque me parece el más conveniente. ¡Muy agradable! –

+0

He estado buscando un método como este por días. Muchas gracias !! –

7

Puede usar una secuencia de cadenas y leer los elementos en el vector.

Here muchos ejemplos diferentes ...

una copia de uno de los ejemplos:

std::vector<std::string> split(const std::string& s, char seperator) 
{ 
    std::vector<std::string> output; 

    std::string::size_type prev_pos = 0, pos = 0; 

    while((pos = s.find(seperator, pos)) != std::string::npos) 
    { 
     std::string substring(s.substr(prev_pos, pos-prev_pos)); 

     output.push_back(substring); 

     prev_pos = ++pos; 
    } 

    output.push_back(s.substr(prev_pos, pos-prev_pos)); // Last word 

    return output; 
} 
+0

pueden ufls darme un ejemplo – venkysmarty

+0

en el enlace proporcionado espacio se utiliza como un separador ¿cómo puedo especificar ";" como un separador – venkysmarty

+1

Hay muchos ejemplos, algunos con separador de espacio y otros con un separador variable – Fox32

6

Hay varias bibliotecas disponibles para resolver este problema, pero la más sencilla es probablemente usar Boost Tokenizer:

#include <iostream> 
#include <string> 
#include <boost/tokenizer.hpp> 
#include <boost/foreach.hpp> 

typedef boost::tokenizer<boost::char_separator<char> > tokenizer; 

std::string str("denmark;sweden;india;us"); 
boost::char_separator<char> sep(";"); 
tokenizer tokens(str, sep); 

BOOST_FOREACH(std::string const& token, tokens) 
{ 
    std::cout << "<" << *tok_iter << "> " << "\n"; 
} 
Cuestiones relacionadas