http://www.cppreference.com/wiki/string/find
A find-nek megadhatod második paraméterként, hogy hányadik indextől nézze, és akkor nem kell a bűvészkedés az iterátorokkal.
iterator=szabaly.find('c',iterator)+1;
//Ilyenkor 0-t ad vissza, ha a végére ért. Szívás, ha az 0. pont a 'c'
iterator=szabaly.find('c',iterator+1);
//Ilyenkor npos-t, de az iterátor a 'c'-re mutat, nem mögé.
//én így csinálnám:
iterator=szabaly.find('c',0);
while (iterator!=string::npos)
{
++iterator;
// ...
// ...
iterator=szabaly.find('c',iterator);
}
A te verziódban pont az iterator bűvészkedés az, ami a gondot okozza.
A find, ha nem talál semmit string::npos-t ad vissza, ami nem más mint a maximum értéke a size_t-nek, ami egy unsigned valami.
http://www.cplusplus.com/reference/string/string/npos.html
Tehát a szabaly.substr(iterator+1).find('c') visszaad npos-t, te ehhez hozzáadsz iterátor+1-et.
De npos+1==0, mivel npos a legnagyobb ábrázolható szám, tehát túlcsordulás lép fel.
Azaz npos+iterator+1==iterator. Tehát az előző 'c' az első karakter...
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o