una separar recorrer por manejo letras extraer delimitadores datos comas caracteres cadenas cadena c++ string split

separar - ¿Hay una forma integrada de dividir cadenas en C++?



separar por comas c (10)

Aquí hay una función de división de estilo perl que uso:

void split(const string& str, const string& delimiters , vector<string>& tokens) { // Skip delimiters at beginning. string::size_type lastPos = str.find_first_not_of(delimiters, 0); // Find first "non-delimiter". string::size_type pos = str.find_first_of(delimiters, lastPos); while (string::npos != pos || string::npos != lastPos) { // Found a token, add it to the vector. tokens.push_back(str.substr(lastPos, pos - lastPos)); // Skip delimiters. Note the "not_of" lastPos = str.find_first_not_of(delimiters, pos); // Find next "non-delimiter" pos = str.find_first_of(delimiters, lastPos); } }

bien hay por cadena me refiero a std :: cadena


La respuesta es no. Tienes que dividirlos usando una de las funciones de la biblioteca.

Algo que yo uso:

std::vector<std::string> parse(std::string l, char delim) { std::replace(l.begin(), l.end(), delim, '' ''); std::istringstream stm(l); std::vector<std::string> tokens; for (;;) { std::string word; if (!(stm >> word)) break; tokens.push_back(word); } return tokens; }

También puede echar un vistazo al basic_streambuf<T>::underflow() y escribir un filtro.


No hay una forma integrada de dividir una cadena en C ++, pero boost proporciona la biblioteca de cadenas para hacer todo tipo de manipulación de cadenas, incluida la splitting cadenas.


No hay una manera común de hacer esto.

Prefiero el boost::tokenizer , su encabezado solo y fácil de usar.


Qué diablos ... Aquí está mi versión ...

Nota: la división en ("XZaaaXZ", "XZ") le dará 3 cadenas. 2 de esas cadenas estarán vacías y no se agregarán a theStringVector si theIncludeEmptyStrings es falso.

Delimitador no es ningún elemento del conjunto, sino que coincide con la cadena exacta.

inline void StringSplit( vector<string> * theStringVector, /* Altered/returned value */ const string & theString, const string & theDelimiter, bool theIncludeEmptyStrings = false ) { UASSERT( theStringVector, !=, (vector<string> *) NULL ); UASSERT( theDelimiter.size(), >, 0 ); size_t start = 0, end = 0, length = 0; while ( end != string::npos ) { end = theString.find( theDelimiter, start ); // If at end, use length=maxLength. Else use length=end-start. length = (end == string::npos) ? string::npos : end - start; if ( theIncludeEmptyStrings || ( ( length > 0 ) /* At end, end == length == string::npos */ && ( start < theString.size() ) ) ) theStringVector -> push_back( theString.substr( start, length ) ); // If at end, use start=maxSize. Else use start=end+delimiter. start = ( ( end > (string::npos - theDelimiter.size()) ) ? string::npos : end + theDelimiter.size() ); } } inline vector<string> StringSplit( const string & theString, const string & theDelimiter, bool theIncludeEmptyStrings = false ) { vector<string> v; StringSplit( & v, theString, theDelimiter, theIncludeEmptyStrings ); return v; }


Sí, stringstream.

std::istringstream oss(std::string("This is a test string")); std::string word; while(oss >> word) { std::cout << "[" << word << "] "; }


Un método bastante simple sería usar el método c_str () de std :: string para obtener una matriz de caracteres de estilo C, luego usar strtok () para tokenizar la cadena. No es tan elocuente como algunas de las otras soluciones enumeradas aquí, pero es fácil y funciona.


Cuerdas C

Simplemente inserte un /0 donde desea dividir. Esto es lo más integrado que puede obtener con las funciones C estándar.

Esta función se divide en la primera aparición de un separador de caracteres, devolviendo la segunda cadena.

char *split_string(char *str, char separator) { char *second = strchr(str, separator); if(second == NULL) return NULL; *second = ''/0''; ++second; return second; }


Cuerdas STL

Puedes usar iteradores de cadenas para hacer tu trabajo sucio.

std::string str = "hello world"; std::string::const_iterator pos = std::find(string.begin(), string.end(), '' ''); // Split at '' ''. std::string left(str.begin(), pos); std::string right(pos + 1, str.end()); // Echoes "hello|world". std::cout << left << "|" << right << std::endl;


void split(string StringToSplit, string Separators) { size_t EndPart1 = StringToSplit.find_first_of(Separators) string Part1 = StringToSplit.substr(0, EndPart1); string Part2 = StringToSplit.substr(EndPart1 + 1); }