Код функции replace
выглядит нормально, но все способы, которые вы вызываете, вводят неопределенное поведение:
Сначала, с replace("Move a mountain", "card", 0,4)
, вы передаете строковый литерал в качестве аргумента для str1
,который затем изменяется в replace
.Модификация строкового литерала - неопределенное поведение, и если он «работает», то это просто удача (на самом деле это скорее неудача, чем удача).
Второй char *list[1]={"Move a mountain"}
похож, но создает другую проблему: char*list
это массив указателей, и вы инициализируете list[0]
, чтобы указывать на строковый литерал ""Move a mountain"
.Таким образом, передача list[0]
снова приведет к UB из-за изменения строкового литерала.Но затем вы передаете list[1]
, что выходит за пределы и поэтому вводит неопределенное поведение.Опять же, все может произойти, segfaulting является лишь одной из таких возможностей.
Напишите
char list[] = "Move a mountain"; // copies string literal into a new and modifiable array
replace(list, "card",0,4)
, и это должно работать лучше.