Función buscar - reemplazar

Iniciado por Pool9, 3 Mayo 2018, 22:51 PM

0 Miembros y 1 Visitante están viendo este tema.

Pool9

Necesito ayuda con el siguiente problema, consiste en buscar una palabra en un parrafo y reemplazarla por otra, lo que no logro es que me la busque en todo el parrafo, solo me sale a la primera coincidencia y los demás no lo imprime.
Les dejo el codigo de lo que he hecho.
Gracias.

void CambiaPalabra(char *parrafo, char *buscar, char *reemplazar){
char *p;

p = strstr(parrafo, buscar);

if (p) {
char *text = new char[(strlen(parrafo)+strlen(reemplazar))];
strncpy(text,parrafo,(p-parrafo));
strcat(text,reemplazar);

cout<<text<<endl;
}else{
cout <<buscar<<" no esta en el parrafo."<< endl;
}
}

Serapis

#1

Tienes que hacer un bucle...

Recordar el punto donde encontró la palabra la última vez, sumar la longitud del texto de remplazo (si el remplazo es dinámico, o la longitud de de lo que se busca si el remplazo será diferido) y seguir buscando desde ahí, hasta llegar al final del texto (el final del texto, es su longitud menos el tamaño de lo que se busca, esto es, la búsqueda acaba cuando no quepa la palabra entera en lo que resta).



Funcion MultipleRemplazos(Texto, Busca, Remplaza)
    n= 0
    n = Buscar(Texto, Busca, n)
    Hacer mientras (n>0)
       Remplazar(texto, Remplaza, n, Busca.length)
        n += remplaza.lenght
 
       n = Buscar(Texto, Busca, n)
    Repetir
fin funcion

- 'Buscar' es una función que localiza 'busca' sobre 'texto', a partir de la posición 'n'. Si lo encuentra devuelve su posición, si no devuelve -1.

- 'Remplazar' es una función que devuelve un texto tal que copia desde 0 hasta n de 'texto', en del destino, a continuación pega el texto 'remplazo', y luego el texto que resta desde n + busca.lenght hasta el final de 'texto' en destino.

Éste es un remplazo dinámico, es más lento que uno estático, porque cada vez que cambie el tamaño del string, debe reconstruirse por completo. El dinámico es más efectivo que el estático cuando el texto que se busca es del mismo tamaño que el texto que lo remplaza, ya que entonces el remplazo puede hacerse insitu, sin necesidad de reconstruir el string.

Un remplazo estático, exige dos bucles, en el primero contabiliza cuantos hallazgos hay, calcula en base a ello, el tamaño del string de salida y aloja memoria para contenerlo. Luego en el segundo bucle va localizando otra vez los hallazgos y va copiando los tramos que no coinciden, seguido de una copia del texto de remplazo, y cuando no quedan más hallazgos, copia el tramo final (tras el último hallazgo, si éste no ocupó ultima posición en el string).

Sin embargo el pseudocódigo anterior es cómodo de usar, porque las funciones que lo realizan suelen estar en todos los lenguajes... tampoco es muy notable el retraso para cadenas muy cortas o de pocos remplazos, pero será tanto más notorio, cuanto más caracteres tenga el texto (se notará cuando haya millones de caracteres) y/o cuando haya muchos remplazos (con decenas ya se notará)... de hecho tanto más notable cuanto más grande sea una o ambas de dichas cuestiones.