Zobaczmy co się dzieje w twojej funkcji
string znaki(string y,string z)
{
size_t x; // niezainicjowana wartość
while(x!=string::npos) // porównanie z niezainicjowaną wartością
{
size_t x=y.find(z); // przesłonięcie zmiennej x (nowa zmienna o tej samej nazwie)
y.erase(y.begin()+x); //wywołanie erase bez sprawdzenia poprawności
}
return y;
}
A teraz wersja poprawiona
string znaki(string y,string z)
{
size_t x=y.find(z);
while(x!=string::npos)
{
y.erase(y.begin()+x);
x=y.find(z);
}
return y;
}