2011-04-09 16 views
42

Duplicar posible:
How to split a string?Manera correcta de dividir un std :: string en un vector <string>

¿Cuál es la manera correcta de dividir una cadena en un vector de cadenas. Delimitador es espacio o coma.

+0

división en la que las comas y los espacios son ambos delimitadores, o una función que se divide en espacio o en coma, de acuerdo con un parámetro? –

+0

Algunas de las respuestas a http://stackoverflow.com/questions/236129/how-to-split-a-string se pueden adaptar fácilmente para trabajar con múltiples delimitadores. –

Respuesta

68

Para las cadenas separadas por espacios, entonces usted puede hacer esto:

std::string s = "What is the right way to split a string into a vector of strings"; 
std::stringstream ss(s); 
std::istream_iterator<std::string> begin(ss); 
std::istream_iterator<std::string> end; 
std::vector<std::string> vstrings(begin, end); 
std::copy(vstrings.begin(), vstrings.end(), std::ostream_iterator<std::string>(std::cout, "\n")); 

Salida:

What 
is 
the 
right 
way 
to 
split 
a 
string 
into 
a 
vector 
of 
strings 

Demo en línea: http://ideone.com/d8E2G


cadena que tiene tanto coma y un espacio

struct tokens: std::ctype<char> 
{ 
    tokens(): std::ctype<char>(get_table()) {} 

    static std::ctype_base::mask const* get_table() 
    { 
     typedef std::ctype<char> cctype; 
     static const cctype::mask *const_rc= cctype::classic_table(); 

     static cctype::mask rc[cctype::table_size]; 
     std::memcpy(rc, const_rc, cctype::table_size * sizeof(cctype::mask)); 

     rc[','] = std::ctype_base::space; 
     rc[' '] = std::ctype_base::space; 
     return &rc[0]; 
    } 
}; 

std::string s = "right way, wrong way, correct way"; 
std::stringstream ss(s); 
ss.imbue(std::locale(std::locale(), new tokens())); 
std::istream_iterator<std::string> begin(ss); 
std::istream_iterator<std::string> end; 
std::vector<std::string> vstrings(begin, end); 
std::copy(vstrings.begin(), vstrings.end(), std::ostream_iterator<std::string>(std::cout, "\n")); 

Salida:

right 
way 
wrong 
way 
correct 
way 

Demo Online: http://ideone.com/aKL0m

+0

'std :: vector vstrings (begin, end);' sería una OMI más agradable, pero supongo que no sabemos si el que pregunta está construyendo el vector, o esperando llenar un vector preexistente. –

+0

Agradable, pero incorrecto. El OP fue específico ya que tanto el espacio como la coma son delímetros.Y no puedes hacer el mismo truco en este caso, ¿verdad? –

+0

@Steve: Buena sugerencia. @Armen: OP no mencionó nada cuando di la solución. La pregunta no parece ser lo suficientemente clara. De lo contrario, hay algunas formas elegantes de manejar el espacio y la coma simultáneamente: http://stackoverflow.com/questions/4888879/elegant-ways-to-count-the-frequency-of-words-in-a-file – Nawaz

106

Una manera conveniente sería boost's string algorithms library.

#include <boost/algorithm/string/classification.hpp> // Include boost::for is_any_of 
#include <boost/algorithm/string/split.hpp> // Include for boost::split 
// ... 

std::vector<std::string> words; 
std::string s; 
boost::split(words, s, boost::is_any_of(", "), boost::token_compress_on); 
9

Si la cadena tiene dos espacios y comas que puede utilizar la función de clase string

found_index = myString.find_first_of(delims_str, begin_index) 

en un bucle. Comprobación de! = Npos e inserción en un vector. Si prefiere la escuela vieja, también puede usar el C

strtok() 

método.

1
vector<string> split(string str, string token){ 
    vector<string>result; 
    while(str.size()){ 
     int index = str.find(token); 
     if(index!=string::npos){ 
      result.push_back(str.substr(0,index)); 
      str = str.substr(index+token.size()); 
      if(str.size()==0)result.push_back(str); 
     }else{ 
      result.push_back(str); 
      str = ""; 
     } 
    } 
    return result; 
} 

Blockquote

split ("1,2,3", "") ==> [ "1", "2", "3"]

split ("1,2,", ",") ==> ["1", "2", ""]

split ("1token2token3", "token") ==> ["1", "2", "3"]

0

hice esta función personalizada que convertirá la línea vector

#include <iostream> 
#include <vector> 
#include <ctime> 
#include <string> 

using namespace std; 

int main(){ 

    string line; 
    getline(cin, line); 
    int len = line.length(); 
    vector<string> subArray; 

    for (int j = 0, k = 0; j < len; j++) { 
     if (line[j] == ' ') { 
      string ch = line.substr(k, j - k); 
      k = j+1; 
      subArray.push_back(ch); 
     } 
     if (j == len - 1) { 
      string ch = line.substr(k, j - k+1); 
      subArray.push_back(ch); 
     } 
    } 

    return 0; 
} 
Cuestiones relacionadas