Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

mechanizm działania metody rfind w string

Ostatnio zmodyfikowano 2016-07-11 18:45
Autor Wiadomość
CLynx
Temat założony przez niniejszego użytkownika
mechanizm działania metody rfind w string
» 2016-07-11 15:21:04
Kod:

C/C++
#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?
P-149840
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?
P-149841
pekfos
» 2016-07-11 16:25:51
naszTekst.rfind( 'C++' );
Tekst się podaje w cudzysłowach.
P-149844
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?

P-149847
Monika90
» 2016-07-11 18:45:35
Efekt jest taki jakbyś szukał pojedynczego znaku '+'
C/C++
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.
P-149851
« 1 »
  Strona 1 z 1