Foros ZackYFileS

Foros ZackYFileS (http://foros.zackyfiles.com/index.php)
-   PROGRAMACIÓN Lenguajes: Visual Basic, C++, etc (http://foros.zackyfiles.com/forumdisplay.php?f=370)
-   -   funcion sustituir en c++ (http://foros.zackyfiles.com/showthread.php?t=571693)

NH 25/04/2008 14:54

funcion sustituir en c++
 
Hola,estoy intentando hacer una funcion en c++ que lo que haga es: dada una linea de un fichero.txt y una palabra introducida por teclado, quiero que si esa palabra introducida,está en esa linea de fichero,me la cambie por otra palabra tb introducida por teclado. Este es mi codigo de dicha funcion, pero solo me funciona cuando la palabra a cambiar esta al principio de la linea, si esta x el medio o el final no lo hace.

void SustituirPalabra(string &frase,string palCambio,string palNueva)
{
int i=0,j=0,k=0,l=0;
bool fin=false;
string aux="";
string parte1="";
string parte2="";

for(i=0;((i<(int)frase.length()-(int)palCambio.length() +1 )&& (fin==false));i++){
for(j=0;j<(int)palCambio.length();j++){
aux=aux+frase[i+j];
if(aux==palCambio){
for(k=0;k<i;k++){
parte1=parte1+frase[k];
}
for(l=(i+palCambio.length());l<(int)frase.length();l++){
parte2=parte2+frase[l];
}
frase=parte1+palNueva+parte2;
fin=true;
i=i+palNueva.length();
}
}
}
}

¿Alguna sugerencia? Nesito ayuda es urgente!! Gracias.
Un salu2.

ElZazu 25/04/2008 21:01

Luego lo miro con calma, pero veo que no limpias la variable aux antes del for de j, con lo que sólo lo hace bien al principio (de ahí que sólo te detecte la palabra al principio). Ademas el fin=true te hace que sólo encuentre sólo la primera coincidencia que encuentre, no se si es el propósito, pero no parece que es lo que quieras, ya que aumentas i para seguir leyendo por donde debe, pero al ponerle esta bandera, se sale y no sigue.

Saludos

Coke-OFF 25/04/2008 22:24

efectivamente, es lo que dice elzazu, no limpias la variable y lo que hace es ir sumando el texto, con lo que solo te funciona con la primera palabra...

Código PHP:

void SustituirPalabra(string &frase,string palCambio,string palNueva)
{
    
int i=0,j=0,k=0,l=0;
    
bool fin=false;
    
string aux="";
    
string parte1="";
    
string parte2="";

    for(
i=0;((i<(int)frase.length()-(int)palCambio.length() +)&& (fin==false));i++){      
        for(
j=0;j<(int)palCambio.length();j++){
            
aux=aux+frase[i+j];
            if(
aux==palCambio){
                for(
k=0;k<i;k++){
                    
parte1=parte1+frase[k];
                }
                for(
l=(i+palCambio.length());l<(int)frase.length();l++){
                    
parte2=parte2+frase[l];
                }
                
frase=parte1+palNueva+parte2;
                
fin=true;
                
i=i+palNueva.length();
            }
        }
        
aux "";
    }



NH 28/04/2008 19:25

dios!no se m habia ocurrido!!aunque ya es tarde,lo probare de todas formas. Muchas gracias x la ayuda. salu2

SetFlag 29/04/2008 16:20

Una sugerencia, usa las funciones miembro de la clase std::string para estos menesteres, todo tu código se hubiera quedado en:

void Replace(std::string& inOut, const std::string& value, const std::string newValue)
{
int pos = 0;

while((pos = inOut.find(value, pos))!= -1)
inOut.replace(pos,value.length(), newValue);
}

Que aparte de ser mas legible es mas eficiente.

Un saludo.


La franja horaria es GMT +2. Ahora son las 17:22.

Powered por vBulletin™ Version 3.8.10
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.
Traducido por vBsoporte - vBulletin en español
ZackYFileS - Foros de Debate