Вам только что повезло.
Из документации strcpy
:
Функция strcpy () копирует строку, на которую указываетs2 (включая завершающий нулевой байт) в массив, на который указывает s1. Если копирование происходит между объектами, которые перекрываются, поведение не определено.
В вашем случае строки перекрываются, ваша программа вызывает неопределенное поведение.
ВозможноПричина, по которой он работал, но больше не работает, заключается в том, что strcpy
мог быть реализован GCC как встроенный, например memmove
(то есть безопасен в этой ситуации), но это изменилось на небезопасную версию по соображениям производительности.(Это чистое предположение.)
Чтобы исправить это, используйте memmove
вместо strcpy
, например:
while (t = strstr(p, "//")) {
memmove(t, t+1, strlen(t)); // strlen(t)'s bytes worth of data
// will cover the string bytes left
// and the \0 terminator
}
Это не очень эффективно, но это будет работать переносимо - memmove
должен обрабатывать перекрывающиеся области памяти.