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.
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.
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
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
'std :: vector
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? –
@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
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);
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.
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"]
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;
}
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? –
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. –