¿Cuál es la forma efectiva de reemplazar todas las ocurrencias de un personaje con otro personaje en std::string
?
c++
algorithm
str-replace
stdstring
big-z
fuente
fuente
std::string
es un contenedor específicamente diseñado para operar con secuencias de caracteres. enlacestd::string::replace()
lugar destd::replace()
! 'x' (char
) se convierte implícitamente ensize_t
[valor 120], por lo que toda la cadena o parte de ella se rellenará con 120 copias de 'y'.Pensé en tirar el solución de impulso :
fuente
-I
indicadores para su compilador para que pueda encontrar las bibliotecas Boost en su sistema. Quizás necesite incluso instalarlo primero.La pregunta se centra en el
character
reemplazo, pero, como encontré esta página muy útil (especialmente el comentario de Konrad ), me gustaría compartir esta implementación más generalizada, que también permite tratarsubstrings
:Uso:
Salidas:
EDITAR:
Lo anterior se puede implementar de una manera más adecuada, en caso de que el rendimiento sea de su interés, devolviendo nada (
void
) y realizando los cambios directamente en la cadenastr
dada como argumento, pasado por dirección en lugar de por valor . Esto evitaría una copia inútil y costosa de la cadena original, al tiempo que devuelve el resultado. Tu llamada, entonces ...Código:
Espero que esto sea útil para otros ...
fuente
from
cadena está vacía, de lo contrario se producirá un bucle sin fin.Imagine un blob binario grande donde todos los 0x00 bytes serán reemplazados por "\ 1 \ x30" y todos los 0x01 bytes por "\ 1 \ x31" porque el protocolo de transporte no permite \ 0-bytes.
En casos donde:
las soluciones proporcionadas no pueden aplicarse (porque reemplazan solo caracteres individuales) o tienen un problema de rendimiento, porque llamarían a string :: replace varias veces, lo que genera copias del tamaño del blob una y otra vez. (No conozco la solución de impulso, tal vez esté bien desde esa perspectiva)
Éste recorre todas las ocurrencias en la cadena de origen y construye la nueva cadena pieza por pieza una vez :
fuente
Un simple buscar y reemplazar un solo personaje sería algo así como:
s.replace(s.find("x"), 1, "y")
Para hacer esto para toda la cadena, lo más fácil sería hacer un bucle hasta que
s.find
comience a regresarnpos
. Supongo que también podrías atraparlorange_error
para salir del bucle, pero eso es un poco feo.fuente
{
personaje. No sé qué es un "doble corsé". Tal vez tienes algún tipo de problema de fuente?Si está buscando reemplazar más de un solo personaje, y está tratando solo con
std::string
, entonces este fragmento funcionaría, reemplazando sNeedle en sHaystack con sReplace, y sNeedle y sReplace no necesitan ser del mismo tamaño. Esta rutina usa el ciclo while para reemplazar todas las ocurrencias, en lugar de solo la primera que se encuentra de izquierda a derecha.fuente
find
llamada dos veces. Considere hacer de ese resultado una variable temporal.Como sugirió Kirill, use el método de reemplazo o itere a lo largo de la cadena reemplazando cada carácter de forma independiente.
Alternativamente, puede usar el
find
método ofind_first_of
dependiendo de lo que necesite hacer. Ninguna de estas soluciones hará el trabajo de una vez, pero con unas pocas líneas adicionales de código debe hacer que funcionen para usted. :-)fuente
fuente
word
es largo, puede haber mucha sobrecarga al llamar a la función. Puede optimizar esta pasandoword
,target
yreplacement
como const referencias.¿Qué pasa con Abseil StrReplaceAll ? Desde el archivo de encabezado:
fuente
Vieja escuela :-)
Resultado:
fuente
¡Esto funciona! Usé algo similar a esto para una aplicación de librería, donde el inventario se almacenaba en un archivo CSV (como un archivo .dat). Pero en el caso de un solo carácter, lo que significa que el sustituto es solo un carácter, por ejemplo, '|', debe estar entre comillas dobles "|" para no lanzar una conversión inválida const char.
De manera poco habitual, estoy usando CentOS actualmente, por lo que mi versión del compilador está a continuación. La versión C ++ (g ++), C ++ 98 predeterminada:
fuente
Si está dispuesto a usar
std::string
s, puede usar la función de esta aplicación de muestrastrsub
tal cual o actualizarla si desea que tome un tipo diferente o un conjunto de parámetros para lograr aproximadamente el mismo objetivo. Básicamente, utiliza las propiedades y funcionalidades destd::string
para borrar rápidamente el conjunto de caracteres coincidentes e insertar los caracteres deseados directamente dentro delstd::string
. Cada vez que realiza esta operación de reemplazo, el desplazamiento se actualiza si aún puede encontrar caracteres coincidentes para reemplazar, y si no puede debido a nada más para reemplazar, devuelve la cadena en su estado desde la última actualización.Si no desea confiar en usar
std::string
s como sus parámetros para poder pasar cadenas de estilo C en su lugar, puede ver la muestra actualizada a continuación:fuente
Para situaciones simples, esto funciona bastante bien sin usar ninguna otra biblioteca que luego std :: string (que ya está en uso).
Reemplace todas las ocurrencias del carácter a con el carácter b en alguna_cadena :
Si la cadena es grande o varias llamadas para reemplazar es un problema, puede aplicar la técnica mencionada en esta respuesta: https://stackoverflow.com/a/29752943/3622300
fuente
Aquí hay una solución que hice, en un espíritu DRI máximo. buscará sNeedle en sHaystack y lo reemplazará por sReplace, nTimes si no es 0, de lo contrario, todas las ocurrencias de sNeedle. no buscará nuevamente en el texto reemplazado.
fuente