Puede usar la std::string::find()
función para encontrar la posición de su delimitador de cadena, luego usar std::string::substr()
para obtener un token.
Ejemplo:
std::string s = "scott>=tiger";
std::string delimiter = ">=";
std::string token = s.substr(0, s.find(delimiter)); // token is "scott"
La find(const string& str, size_t pos = 0)
función devuelve la posición de la primera aparición de str
en la cadena, o npos
si no se encuentra la cadena.
La substr(size_t pos = 0, size_t n = npos)
función devuelve una subcadena del objeto, comenzando en la posición pos
y de longitud npos
.
Si tiene varios delimitadores, después de extraer un token, puede eliminarlo (incluido el delimitador) para continuar con las extracciones posteriores (si desea preservar la cadena original, simplemente use s = s.substr(pos + delimiter.length());
):
s.erase(0, s.find(delimiter) + delimiter.length());
De esta manera, puedes recorrer fácilmente para obtener cada token.
Ejemplo completo
std::string s = "scott>=tiger>=mushroom";
std::string delimiter = ">=";
size_t pos = 0;
std::string token;
while ((pos = s.find(delimiter)) != std::string::npos) {
token = s.substr(0, pos);
std::cout << token << std::endl;
s.erase(0, pos + delimiter.length());
}
std::cout << s << std::endl;
Salida:
scott
tiger
mushroom
size_t last = 0; size_t next = 0; while ((next = s.find(delimiter, last)) != string::npos) { cout << s.substr(last, next-last) << endl; last = next + 1; } cout << s.substr(last) << endl;
mushroom
salidas fuera del bucle, es decirs = mushroom
std::string token = s.substr(s.find(delimiter) + 1);
, si está seguro de que existe (uso +1 en la longitud) ...Este método utiliza
std::string::find
sin mutar la cadena original al recordar el comienzo y el final del token de subcadena anterior.fuente
Puede usar la siguiente función para dividir cadenas:
fuente
split("abc","a")
devolverá un vector o una sola cadena"bc"
, donde creo que tendría más sentido si hubiera devuelto un vector de elementos["", "bc"]
. Al usarstr.split()
Python, fue intuitivo para mí que debería devolver una cadena vacía en caso de quedelim
se encontrara al principio o al final, pero esa es solo mi opinión. De todos modos, creo que debería mencionarseif (!token.empty())
prevención del problema mencionado por @kyriakosSt, así como otros problemas relacionados con delimitadores consecutivos.if (!token.empty())
no parece ser suficiente para solucionarlo.Para delimitador de cadena
División de cadena basada en un delimitador de cadena . Como dividir la cadena en
"adsf-+qwret-+nvfkbdsj-+orthdfjgh-+dfjrleih"
función del delimitador de cadena"-+"
, la salida será{"adsf", "qwret", "nvfkbdsj", "orthdfjgh", "dfjrleih"}
Salida
Para delimitador de un solo carácter
División de cadena basada en un delimitador de caracteres. Como dividir una cadena
"adsf+qwer+poui+fdgh"
con delimitador"+"
generará{"adsf", "qwer", "poui", "fdg"h}
Salida
fuente
vector<string>
, creo que se llamará constructor de copia.Este código divide las líneas del texto y agrega a todos a un vector.
Llamado por:
fuente
vector<string> split(char *phrase, const string delimiter="\n")
strtok le permite pasar múltiples caracteres como delimitadores. Apuesto a que si pasa "> =" su cadena de ejemplo se dividirá correctamente (a pesar de que> y = se cuentan como delimitadores individuales).
EDITAR si no desea usar
c_str()
para convertir de string a char *, puede usar substr y find_first_of para tokenizar.fuente
strtok()
ya que requeriría que use char array en lugar de string..c_str()
También es barato y fácil.Aquí está mi opinión sobre esto. Maneja los casos extremos y toma un parámetro opcional para eliminar entradas vacías de los resultados.
Ejemplos
fuente
Esto debería funcionar perfectamente para delimitadores de cadena (o caracteres únicos). No te olvides de incluir
#include <sstream>
.El primer bucle while extrae un token utilizando el primer carácter del delimitador de cadena. El segundo bucle while omite el resto del delimitador y se detiene al comienzo del siguiente token.
fuente
Me gustaría utilizar
boost::tokenizer
. Aquí hay documentación que explica cómo hacer una función apropiada de tokenizer: http://www.boost.org/doc/libs/1_52_0/libs/tokenizer/tokenizerfunction.htmAquí hay uno que funciona para su caso.
fuente
La respuesta ya está allí, pero la respuesta seleccionada utiliza la función de borrado que es muy costosa, piense en una cadena muy grande (en MB). Por lo tanto, uso la siguiente función.
fuente
string.split()
método Python .)Este es un método completo que divide la cadena en cualquier delimitador y devuelve un vector de las cadenas cortadas.
Es una adaptación de la respuesta de ryanbwork. Sin embargo, su comprobación para:
if(token != mystring)
da resultados incorrectos si tiene elementos repetidos en su cadena. Esta es mi solución a ese problema.fuente
while (true)
suele dar miedo ver en un código como este. Personalmente, recomendaría reescribir esto para que la comparación constd::string::npos
(o, respectivamente, un cheque en contramystring.size()
) hagawhile (true)
obsoleto.Si no desea modificar la cadena (como en la respuesta de Vincenzo Pii) y desea generar también el último token, puede utilizar este enfoque:
fuente
PD: funciona solo si las longitudes de las cadenas después de dividir son iguales
fuente
Función:
Pruebas unitarias:
fuente
fuente
fuente