He intentado escribir una función de reemplazo de cadena en C, que funciona en un char *
, que se ha asignado usando malloc()
. Es un poco diferente ya que encontrará y reemplazará cadenas, en lugar de caracteres en la cadena de inicio.¿Por qué recibo un doble error libre con realloc()?
Es trivial si las cadenas de búsqueda y reemplazo tienen la misma longitud (o la cadena de reemplazo es más corta que la cadena de búsqueda), ya que tengo espacio suficiente asignado. Si trato de usar realloc()
, aparece un error que me indica que estoy haciendo una doble libre, lo que no veo como soy, ya que solo estoy usando realloc()
.
Tal vez un poco de código ayudará: trabaja
void strrep(char *input, char *search, char *replace) {
int searchLen = strlen(search);
int replaceLen = strlen(replace);
int delta = replaceLen - searchLen;
char *find = input;
while (find = strstr(find, search)) {
if (delta > 0) {
realloc(input, strlen(input) + delta);
find = strstr(input, search);
}
memmove(find + replaceLen, find + searchLen, strlen(input) - (find - input));
memmove(find, replace, replaceLen);
}
}
El programa, hasta el trato de realloc()
en un caso en el que la cadena reemplazado será más larga que la cadena inicial. (Todavía funciona, solo arroja errores y el resultado).
Si ayuda, el código de llamada se parece a:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void strrep(char *input, char *search, char *replace);
int main(void) {
char *input = malloc(81);
while ((fgets(input, 81, stdin)) != NULL) {
strrep(input, "Noel", "Christmas");
}
}
Y si realloc falla, devuelve NULL y deja solo el búfer existente. Acaba de perder el puntero ... :-( –