mechanizm działania metody rfind w string
Ostatnio zmodyfikowano 2016-07-11 18:45
CLynx Temat założony przez niniejszego użytkownika |
mechanizm działania metody rfind w string » 2016-07-11 15:21:04 Kod: #include <iostream> #include <string> using namespace std;
void szukajWszystkichFrazOdKonca( string & tekst, string szukanaFraza ) { size_t znalezionaPozycja = tekst.rfind( szukanaFraza ); if( znalezionaPozycja == string::npos ) { cout << "Nie znaleziono frazy w tekscie" << endl; return; } do { cout << "Fraza zostala odnaleziona na pozycji " << znalezionaPozycja << endl; if( znalezionaPozycja >= szukanaFraza.size() ) znalezionaPozycja = tekst.rfind( szukanaFraza, znalezionaPozycja - szukanaFraza.size() ); else znalezionaPozycja = string::npos; } while( znalezionaPozycja != string::npos ); }
int main() { string naszTekst = "C++ Przyklad z kursu C++ (http://cpp0x.pl) - najlepszy kurs C++ w Internecie! C++C++"; szukajWszystkichFrazOdKonca( naszTekst, "C++" ); size_t poz = naszTekst.rfind( 'C++' ); cout << endl << poz; cout << endl << naszTekst.rfind( 'C++', 4 ); }
Skąd bierze się róznica w zwróconym wyniku pomiędzy wywołaniem rfind w pętli, a w main? |
|
carlosmay |
» 2016-07-11 16:23:45 Skąd bierze się róznica w zwróconym wyniku pomiędzy wywołaniem rfind w pętli, a w main? |
Jaka różnica? Jakieś szczegóły? |
|
pekfos |
» 2016-07-11 16:25:51 naszTekst.rfind( 'C++' ); |
Tekst się podaje w cudzysłowach. |
|
CLynx Temat założony przez niniejszego użytkownika |
» 2016-07-11 17:28:06 Dzięki pekfos faktycznie tu był błąd (pewnie takie problemy początkujących :) ).
calosmay problem był w tym że pozycja wypisana przez funkcję szukajWszystkichFrazOdKonca wynosiła np. 81, a analogiczne wywołanie rfind w main zwracało 83.
Podsumowując jeżeli prawidłowo użyjemy cudzysłowu to rfind zwróci pozycję początku stringa, a jak wstawimy apostrofy to końca. Z czego to wynika?
|
|
Monika90 |
» 2016-07-11 18:45:35 Efekt jest taki jakbyś szukał pojedynczego znaku '+' cout << naszTekst.rfind( '+' );
A zależy to od tego jak kompilator interpretuje literał znakowy złożony z więcej niż jednego znaku. Różne kompilatory mogą to robić różnie. 'C++' nie jest interpretowane jako znak, lecz jako liczba int, która potem jest konwertowana do typu char, bo jedno z przeciążeń rfind przyjmuje argument typu char. I tak się złożyło, że w kompilatorze którego używasz, oznacza to zignorowanie wszystkich znaków w literale 'C++' oprócz ostatniego. |
|
« 1 » |