( tr3w | 2008. 12. 16., k – 11:04 )

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