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

Lekcja 27 - niezrozumienie zapisu

Ostatnio zmodyfikowano 2017-11-23 14:14
Autor Wiadomość
sair
Temat założony przez niniejszego użytkownika
Lekcja 27 - niezrozumienie zapisu
» 2017-11-22 22:20:33
Witam,

w lekcji 27 jako przykład podany jest kod
C/C++
#include <string>
#include <iostream>

void szukajWszystkichFrazOdKonca( std::string & tekst, std::string szukanaFraza )
{
    size_t znalezionaPozycja = tekst.rfind( szukanaFraza );
    if( znalezionaPozycja == std::string::npos )
    {
        std::cout << "Nie znaleziono frazy w tekscie" << std::endl;
        return;
    }
   
    do
    {
        std::cout << "Fraza zostala odnaleziona na pozycji " << znalezionaPozycja << std::endl;
        if( znalezionaPozycja >= szukanaFraza.size() )
             znalezionaPozycja = tekst.rfind( szukanaFraza, znalezionaPozycja - szukanaFraza.size() );
        else
             znalezionaPozycja = std::string::npos;
       
    } while( znalezionaPozycja != std::string::npos );
   
}

int main()
{
    std::string naszTekst = "Przyklad z kursu C++ (http://cpp0x.pl) - najlepszy kurs C++ w Internecie!";
    szukajWszystkichFrazOdKonca( naszTekst, "C++" );
    return 0;
}


Nie rozumiem po co od znalezionej pozycji odejmować "długość" szukanego ciagu znaków:
znalezionaPozycja = tekst.rfind( szukanaFraza, znalezionaPozycja - szukanaFraza.size() );

Wydaje mi się, że skoro tekst jest przeszukiwany od końca i na ekran wypisywana pozycja znaku "C" z tekstu "C++" to w/w linijka jest zbędna a pomijanych jest kilka znaków przy następnym sprawdzaniu.

Proszę o wytłumaczenie :)
Dziekuję z góry.
P-167102
pekfos
» 2017-11-22 23:25:43
Wydaje mi się, że skoro tekst jest przeszukiwany od końca i na ekran wypisywana pozycja znaku "C" z tekstu "C++" to w/w linijka jest zbędna a pomijanych jest kilka znaków przy następnym sprawdzaniu.
Jak to zbędna? Przecież masz znaleźć wszystkie wystąpienia, więc ileś znaków już przeszukanych musisz pominąć. W przypadku "C++" pomijane są 2 dodatkowe znaki bez sprawdzania ich - jeśli twoim zdaniem jest to błędne, upchnij "C++" w dwóch znakach.
P-167104
sair
Temat założony przez niniejszego użytkownika
» 2017-11-23 08:28:35
Chodziło mi raczej o to, że wystarczy napisać
znalezionaPozycja = tekst.rfind( szukanaFraza, znalezionaPozycja - 1 );
I z tym zapisem również działa. A nie rozumiem po co pomijać aż 3 znaki (dla "c++") skoro program pokazuje numer pozycji "C".

Chyba że program sprawdzając od tyłu "zatrzymuje się" na znaku drugiego "+" i od niego zaczynałby kolejne sprawdzanie, a numer pozycji dla "C" należy interpretować jako początek tego ciągu?

Wydaje mi sie, że troszkę zagmatwalem ale mam nadzieję że ktoś zrozumie i rozwieje moje wątpliwości;)
P-167109
YooSy
» 2017-11-23 10:08:04
A nie rozumiem po co pomijać aż 3 znaki
Tak będzie wydajniej. Jeśli szukana fraza będzie miała bardzo dużo znaków,
to po co jeszcze raz przeszukiwać już znaleziony obszar tekstu,
jeśli można po prostu go opuścić i zacząć szukania od pierwszego znaku za znalezioną frazą.

mam nadzieję że ktoś /.../ rozwieje moje wątpliwości;)
Debugger na pewno pomoże w zrozumieniu działania kodu.
P-167111
sair
Temat założony przez niniejszego użytkownika
» 2017-11-23 14:14:03
Dobra :D dzięki za odpowiedzi :) wrócę do tego za kilka dni, może wtedy mi się rozjaśni wszystko :)
P-167120
« 1 »
  Strona 1 z 1