Есть все виды проблем с вашей программой. Я начал с того, что попытался записать их все, но я чувствую, что код не подлежит восстановлению. Имеются ошибки индексации, ошибки передачи параметров, сомнительная рекурсия и т. Д.
Другие ответы, указывающие на ошибку при попытке изменить литерал только для чтения, верны. Это является причиной ошибки в опубликованном вами коде.
Основная причина ваших проблем, на мой взгляд, в том, что код труднее писать, когда у вас есть только один буфер. Вы завязали себе узлы, пытаясь обойти это ограничение в своем дизайне, но со вторым буфером для работы код тривиален.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
const char *input = "abcad";
char *output = malloc(strlen(input)+1);
char *in = input;
char *out = output;
while (*in)
{
if (*in != input[0])
{
*out = *in;
out++;
}
in++;
}
*out = '\0';
printf("%s\n", output);
free(output);
return 0;
}
Если вы хотите стать по-настоящему умным, вы на самом деле можете успешно управлять только одним буфером, если у вас есть два разных указателя для итерации.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char str[] = "abcad";
char compare = str[0];
char *in = str;
char *out = str;
while (*in)
{
if (*in != compare)
{
*out = *in;
out++;
}
in++;
}
*out = '\0';
printf("%s\n", str);
return 0;
}
Обратите внимание, что мы должны были взять копию первого символа в буфере, удаляемый символ, поскольку он может быть изменен итерацией.
Итак, теперь вы вернулись к тому, с чего начали, с одним буфером. Но теперь код работает и его легко понять.
Обратите внимание, что мой ответ написан на C согласно вашему тегу, но обратите внимание, что ваш код - C ++.