Я попытался написать функцию замены строки в C, которая работает на char *
, которая была выделена с помощью malloc()
. Это немного отличается тем, что он найдет и заменит строки, а не символы в исходной строке.
Это тривиально, если строки поиска и замены имеют одинаковую длину (или строка замены короче строки поиска), так как у меня достаточно свободного места. Если я пытаюсь использовать realloc()
, я получаю сообщение об ошибке, которое говорит мне, что я делаю двойную свободную, что я не вижу, как я, поскольку я использую только realloc()
.
Возможно, небольшой код поможет:
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);
}
}
Программа работает, пока я не попытаюсь realloc()
в экземпляре, где замещенная строка будет длиннее начальной. (Это все еще вид работ, он просто выплевывает ошибки, а также результат).
Если это помогает, вызывающий код выглядит так:
#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");
}
}