Cita de: MAFUS en 27 Abril 2017, 12:01 PM
Este último código tiene pérdida de memoria al perder la referencia a cadena. Hay que pensar que es memoria dinámica y hay que liberarla a mano.
Aca lo mejore un poco, ahora le paso un char** para poder modificar la original, primero liberandola y poniendo la cadena nueva. Tambien saque las cadenas temporales y lo hice directamente, las habia usado para ir dandome cuenta que tenia que hacer.
Código (c) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Verifica si la cadena find se encuentra dentro cadena. En caso de ser
// verdad devuelve 1, en caso contrario devuelve 0;
int string_contiene (char* cadena, char* find) {
size_t longCadena = strlen (cadena);
size_t longFind = strlen (find);
if (longCadena == 0) {
return 0;
}
if ((longFind > 0) && (longFind <= longCadena)) {
int count = 0;
for (int i=0; ((i<longCadena) && (count<longFind)); i++) {
count = 0;
if (cadena[i] == find[0]) {
for (; ((count<longFind) && (cadena[i] == find[count])); i++, count++);
}
}
if (count == longFind) {
return 1;
}
}
return 0;
}
// Devuelve la posicion donde comienza la cadena find en la cadena.
// Si la cadena find no se encuentra en cadena, devuelve -1.
int string_posicion (char* cadena, char* find) {
if (string_contiene (cadena, find)) {
size_t longCadena = strlen (cadena);
size_t longFind = strlen (find);
int aux, count = 0;
for (int i=0; ((i<longCadena) && (count<longFind)); i++) {
count = 0;
aux = i;
if (cadena[i] == find[0]) {
for (; ((count<longFind) && (cadena[i] == find[count])); i++, count++);
}
}
if (count == longFind) {
return aux;
}
}
return -1;
}
// Recibe una cadena, una cadena a buscar y una cadena a reemplazar.
// Si la cadena find esta en cadena, reemplaza la primera ocurrencia de find en
// cadena por la cadena str y devuelve la nueva cadena, sino, devuelve la misma
// cadena sin modificar.
void string_reemplazar (char** cadena, char* find, char* str) {
int posicion = string_posicion (cadena[0], find);
if (posicion != -1) {
size_t longCadena = strlen (cadena[0]);
size_t longFind = strlen (find);
size_t longStr = strlen (str);
if (longFind <= longStr) {
char* cadenaModificada = (char*) malloc (sizeof (char) * longCadena + (longStr - longFind) );
}
char* cadenaModificada = (char*) malloc (sizeof (char) * longCadena - (longFind - longStr) );
for (int i=0; i<posicion; i++){
cadenaModificada[i] = cadena[0][i];
cadenaModificada[i+1] = '\0';
}
int j = posicion;
for (int i=0; i<longStr; j++, i++){
cadenaModificada[j] = str[i];
}
for (int i=posicion+longFind; i<longCadena; j++, i++){
cadenaModificada[j] = cadena[0][i];
}
cadenaModificada[j] = '\0';
free (cadena[0]);
cadena[0] = cadenaModificada;
}
}
int main(){
char* cadena = (char*) malloc (sizeof (char) * 100);
char* find = (char*) malloc (sizeof (char) * 50);
char* str = (char*) malloc (sizeof (char) * 50);
printf ("Ingrese una cadena:\n");
gets (cadena);
printf ("Ingrese una palabra a buscar:\n");
gets (find);
printf ("Ingrese el reemplazo:\n");
gets (str);
string_reemplazar (&cadena, find, str);
printf ("La cadena es:\n%s", cadena);
free(cadena);
free(find);
free(str);
return 0;
}