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
- 1524 megtekintés
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
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
És ha a "cx"-ek pozícióira kíváncsi?
KisKresz
- A hozzászóláshoz be kell jelentkezni
if (!strncmp(c++, "cx", 2))
- A hozzászóláshoz be kell jelentkezni
Vagy ha mar C:
int i; char *p;
for (i=0; (p=strstr(buf+i, str)); i = p-buf+1)
printf("Found at %d\n", p-buf);
- A hozzászóláshoz be kell jelentkezni
Na ja. Hosszú sztringeknél mondjuk nem tűnik túl optimálisnak.
KisKresz
- A hozzászóláshoz be kell jelentkezni
c_str() omg, ennyire jó pointerekkel zsonglőrködni?
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni