/* ** Esta funcion crea en memoria reservada de forma dinamica una cadena ** que es identica a 'entrada' pero remplazando todas las instancias ** de la subcadena 'buscar' con la cadena 'remplazar'. ** ** Su valor de retorno es un puntero apuntando a la memoria reservada ** donde se almacena la nueva cadena o NULL en caso de un error interno. ** ** El parametro de salida 'ndr' indica el numero de remplazamientos que ** fueron realizados por la funcion. */ char *rem_cadena(char const *entrada, char const *buscar, char const *remplazar, size_t *ndr) { char *salida; char *p; char *aux; size_t long_entrada = strlen(entrada); size_t long_buscar = strlen(buscar); size_t long_remplazar = strlen(remplazar); size_t long_salida; size_t i, j; /* Asercion: la cadena a buscar debe contener por lo menos un caracter */ assert(long_buscar > 0); if (long_buscar >= long_remplazar) long_salida = long_entrada; else /* Reservar memoria suficiente para el peor escenario */ long_salida = (long_entrada / long_buscar) * long_remplazar + long_entrada % long_buscar; if ((salida = malloc(long_salida + 1)) == NULL) return NULL; j = 0; if (ndr != NULL) *ndr = 0; do { if ((p = strstr(entrada, buscar)) == NULL) /* ** Si la cadena a buscar no se encuentra copiar el resto de ** la cadena de entrada reajustando al mismo tiempo el indice ** de la cadena de salida (j) y terminar el bucle (p == NULL). */ j += sprintf(salida + j, "%s", entrada); else { /* ** Copiar todos los caracteres inmediatamente antes de la ** cadena a buscar. */ for (i = 0; entrada + i < p; i++, j++) salida[j] = entrada[i]; /* ** Copiar la cadena de remplazo y ajustar el indice de la ** cadena de salida (j). */ j += sprintf(salida + j, "%s", remplazar); if (ndr != NULL) ++*ndr; /* ** La busqueda se continua a partir del caracter que sigue a la ** cadena de busqueda encontrada y a la cual apunta p. */ entrada = p + long_buscar; } }while (p != NULL); if ((aux = realloc(salida, j + 1)) == NULL){ free(salida); salida = NULL; }else /* aux != NULL */ salida = aux; return salida; } |