удалить из строки все вхождения буквосочетания из подстроки

Написал код,который должен удалять из строки все вхождения конкретного буквосочетания,почему-то удаляет только первое,а дальше прекращает работу с ошибкой.

#include <iostream>
#include <cstring>
using namespace std;
int main(){
    char S[] = "xyz 1 xyz 2 xyz 3";
    char str[]= "xyz";
    char *p;
    p = strstr(S, str);

    while (p)
    {
        strcpy(p, p + strlen(str));
        break;
    }
    cout << S << endl;
    return 0;
}

Ответы (1 шт):

Автор решения: Harry
char S[] = "xyz 1 xyz 2 xyz 3";
char str[]= "xyz";
for(char *p = strstr(S,str); p; p = strstr(S,str))
    memmove(p,p+strlen(str),strlen(p+strlen(str))+1);
cout << S << endl;

При перекрывающихся областях памяти надо использовать memmove().

→ Ссылка