Hola amigo,
He estado dándole vueltas al problema, y desempolvando un poco el tema del C, que buena falta me hacía, y he aquí el resultado:
/**************************************************************************
+------------------------------------------------------------------------+
| Reemplaza.c |
+------------------------------------------------------------------------+
| |
| (c) 2005 Space Saturn (spsaturn AT terra DOT es) |
| Cedido al Foro de DaboWEB |
| |
| Este programa es software libre. Puedes redistribuirlo y/o modificarlo |
| dentro de los términos de la "GNU General Public License" versión 2. |
| |
| This program is free software. You can redistribute it and/or modify |
| it under the terms of the GNU General Public License version 2 |
| |
+------------------------------------------------------------------------+
**************************************************************************/
#include <stdio.h>
#include <string.h>
static char a[]="Hola MundoDabo";
static char b[]="Mundo";
static char c[]="Foro";
static char d[80]="";
int a_len, b_len, c_len, n, m, p, dif;
int main()
{
n=0;
dif=0;
a_len=(int)strlen(a);
b_len=(int)strlen(b);
c_len=(int)strlen(c);
printf("\n");
printf("Cadena original: %s - Longitud: %d\n",a,a_len);
printf("Cadena a cambiar: %s - Longitud: %d\n",b,b_len);
printf("por: %s - Longitud: %d\n\n",c,c_len);
do
{
m=0;
p=0;
if(a[n]==b[0])
{
if (comp_cad()) reemp_cad();
else d[n-dif]=a[n];
}
else
{
d[n-dif]=a[n];
n++;
}
}while (n<a_len);
printf("Cadena modificada: %s\n\n",d);
return 0;
}
int comp_cad()
{
for(m=0;m<b_len;m++)
{
if(a[n+m]!=b[m])
{
return 0;
}
else return 1;
}
}
int reemp_cad()
{
for(p=0;p<c_len;p++)
{
d[n+p-dif]=c[p];
}
n+=b_len;
dif+=b_len-c_len;
m=0;
return 0;
}
Verás que la frase original es: "Hola MundoDabo", y aquí se cambia "Mundo" por "Foro".
El tema está en que no podemos discriminar por palabras, ya que no hay separación entre Mundo y Dabo, así que recorrí la frase letra a letra, reemplazando el texto, y pasando de contar palabras.
Para ello, se han creado 3 variables, una para cada cadena, y una más que contendrá el resultado. Ésta en principio la he creado de tamaño 80, pero esto va a gusto del consumidor.
Y también 3 variables (int) que contienen sus respectivas longitudes.
El cuerpo principal es un bucle que recorre la frase una a una hasta que llega al final: while (n<a_len)
Si encuentra una coincidencia con la primera letra a reemplazar: if(a[n]==b[0]) salta a la función comp_cad() que se encarga de comprobar si las siguientes también coinciden.
Si es así, pasa a la función: reemp_cad() que es la que reemplazará la cadena.
Verás que hay una variable "dif". Esta se encarga de controlar la diferencia de tamaño entre la cadena a buscar y la cadena de reemplazo. En principio para esta frase no haría mucha falta, pero si probamos con texto más largo donde se repitan, entonces es imprescindible.
He tenido que tener especial atención a la actualización del valor de 'n', que es el que controla la posición "de lectura" de la frase dependiendo de lo que se ha reemplazado. Y he de reconocer que me ha traído por el camino de la amargura, jejeje. Pero ya está controlado.
Bueno, ha sido un placer, espero que te sirva de ayuda, y si tienes cualquier duda, aquí estamos.
Un abrazo!
P.D. El fuente eres libre de usarlo y modificarlo, siempre que incluyas una nota (en el fuente) indicando el autor y esta web. (Tal y como especifica la licencia GNU/GPL)
No es por nada en particular, únicamente que el trabajo que me ha costado sacarlo (algo que seguro es la mar de sencillo para muchos), sirva en beneficio del forillo, y que gane en adeptos.