[megoldva]string find substr-hogy is van ez pontosan?

Fórumok

Sziasztok!
Van egy stringem mondjuke ez:


string szabaly="SaCSaABeEAbBCcBCvCAcABaB"

ebben szeretném én megkeresni mondjuk a 'c'-ket, úgy, hogy előszőr megkapom az első 'c'-indexét majd a másodikét, és így tovább, amig van c a stringben, és ha már nincs, azt is meg tudjam állapítani...

Én eddig így akartam, de ez pl a 'c'-re először kiad 13-at, azután pedig mindíg 19-et, holott én azt várnám hogy 13,19,4294967295-öt ad vissza(4294967295-öt szokta visszaadni a findra, ha nem talál valamit)...


iterator=szabaly.substr(iterator+1).find('c')+iterator+1; //amikor ideérek, akkor az iterátorom már az első c-betűn áll

Szóval valakinek valamilyen ötlet arra, hogy hogy oldjam meg a problémám?
Köszönöm: Kolos

Hozzászólások

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

fú, köszi a segítséget!

Érdekes ez az npos, erről még nem hallottam...Vicces...
Szépen műlködik a programom...úgyhogy kész a véges autómatám,a mi szabályok alapján megmondja, hogy egy szó előállítható-e az adott formális, reguláris nyelvtanból:)
Juppí!:D
Kössz:Kolos


std::string szabaly = "SaCSaABeEAbBCcBCvCAcABaB)";
for(int i = 0, pos; (pos = szabaly.find("c", i)) != string::npos; i = pos + 1)
{
 std::cout << "Talalat! Helye: " << pos << std::endl;
}

--
A gyors gondolat többet ér, mint a gyors mozdulat.

char * c = szabaly.c_str();
for (int pos = 0; *c; ++pos) if (*c++=='c') std::cout << "c @ " << pos << std::endl;

C++ stl-el pont az a bajom, hogy egyszerűsítenie kellene a dolgokat, de mintha a végén minden csak bonyolultabb lenne.

--
The Net is indeed vast and infinite...
http://gablog.eu

Igazábol megszokás kérdése, legalábbis a string kezelés.

Az STL többi része szvsz sokkal kényelmesebb mint a C-s megoldások...

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o