Linux E X P R E S

Facebook

Programovanie v jazyku C++: Knižnica string – funkcie find_first_of a find_last_of

C++

V tomto článku preberieme dve funkcie, s ktorými môžete pohodlné hľadať znaky v reťazci. Ide o funkciu find_first_of a find_last_of . 


Funkcia find_first_of

Spôsoby ako vyhľadavať znaky či časti reťazca je viacero. S funkciou find_first_of viete nájsť prvý výskyt nejakého hľadaného znaku. Funkcia find_first_of vráti prvú pozíciu zhodného znaku v argumente. A pozor, narozdiel od iných funkcii nerozlišuje poradie znakov v argumente funkcie! Čo to v praxi znamená, že porovnáva každý jednotlivý znak reťazca so všetkými znakmi definované ako reťazec v argumente funkcie find_first_of až pokým nenajde prvú zhodu.

1. príklad: Testujeme funkciu find_first_of

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string retazec = "Som sklamany z dnesneho dna!";
    size_t i = retazec.find_first_of("!kom");

    cout << i << " znak: " << retazec[i] << "\n";

    return 0;
}

Výsledok programu:

1 znak: o

2. príklad: Ďalšie možností funkcie find_first_of

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string retazec1 = "Som hladny ako stado vlkov!";
    size_t i = retazec1.find_first_of("mo", 10);   // prvy sposob

    cout << i << " znak: " << retazec1[i] << "\n";

    string retazec2 = "Rad chodim do Tatier.";
    size_t j = retazec2.find_first_of("iT", 10, 1);   // druhy sposob

    cout << j << " znak: " << retazec2[j] << "\n";

    string retazec3 = "Juuu konecne som kupil novy pocitac! Tak sa tesim.";
    size_t k = retazec3.find_first_of('!', 30);   // treti sposob

    cout << k << " znak: " << retazec3[k] << "\n";

    return 0;
}

Výsledok programu:

13 znak: o
17 znak: i
35 znak: !

Rozbor programu:

1. spôsob: Druhý argument je pozícia v reťazci, odkiaľ sa má začať procedúra hľadania.

2. spôsob: Druhý argument je pozícia v reťazci, od ktorej sa má začať hľadať a v treťom argumente sa pýtame, koľko znakov z reťazca argumentu funkcie find_first_to máme testovať. My sme dali číslo 1, čo znamená, že testujeme len znak i. V treťom príklade si bližšie priblížime fungovanie.

3. spôsob: Prvý argument je hľadaný znak a druhý argument pozícia v reťazci, od ktorej začneme hľadať.

3. príklad: Dodatočné experimenty s argumentami funkcie find_first_of

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string retazec = "Som sebe samemu panom.";
    size_t i = retazec.find_first_of("eopuan", 0, 1);

    cout << i << " znak: " << retazec[i] << "\n";

    size_t j = retazec.find_first_of("eopuan", 0, 2);

    cout << j << " znak: " << retazec[j] << "\n";
    retazec.assign("upSom sebe samemu panom.");

    size_t k = retazec.find_first_of("eopuan", 0, 3);

    cout << k << " znak: " << retazec[k] << "\n";

    return 0;
}

Výsledok programu:

5 znak: e
1 znak: o
1 znak: p

Ukážme si komplexnejší príklad na funkciu find_first_of.

4. príklad: Komplexnejší príklad na funkciu find_first_of

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string retazec = "Dnes je den vsezravcov. Nerobim si zarty.";

    cout << retazec << "\n";
    cout << "Hm nemaju tam byt miesto bodiek vykricniky? Nevadi opravime!" << "\n";

    size_t hladam = retazec.find_first_of('.');

    for (size_t i = 0; i < retazec.size(); i++)
    {
        if (i == hladam)
        {
            retazec[i] = '!';
            hladam = retazec.find_first_of('.', i+1);
        }
    }

    cout << retazec << "\n";

    return 0;
}

Výsledok programu:

Dnes je den vsezravcov. Nerobim si zarty.
Hm nemaju tam byt miesto bodiek vykricniky? Nevadi opravime!
Dnes je den vsezravcov! Nerobim si zarty!

Funkcia find_last_of

Ak funkcia find_first_of hľadá prvý výskyt znaku, tak u funkcie find_last_of to bude presne naopak.

5. príklad: Predstavenie funkcie find_last_of

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string retazec = "Pozri hore, tam je Polarka!";
    size_t i = retazec.find_last_of("tP");

    cout << i << " znak: " << retazec[i];

    return 0;
}

Výsledok programu:

19 znak: P

Tak ako funkcia find_first_of tak aj funkcia find_last_of ponúka rovnaké možností argumentov.

6. príklad: Ďalšie možností funkcie find_last_of

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string retazec1 = "Rozum ti chyba chlapce rozum!";
    size_t i = retazec1.find_last_of("rdmeu", 13);

    cout << i << " znak: " << retazec1[i] << "\n";

    string retazec2 = "Slniecko svieti, cas ist vonku!.";
    size_t j = retazec2.find_last_of("is", 14, 2);

    cout << j << " znak: " << retazec2[j] << "\n";

    string retazec3 = "Tesim sa domov na svoju macicku, urcite je uz hladna, chudinka.";
    size_t k = retazec3.find_last_of(',', retazec3.size()-1);

    cout << k << " znak: " << retazec3[k] << "\n";

    return 0;
}

Výsledok programu:

 4 znak: m
14 znak: i
52 znak: ,

Rozbor programu:

Funkcia find_last_of funguje podobne ako funkcia find_first_of až na jeden argument. Zoberme si túto čásť:

size_t i = retazec1.find_last_of("rdmeu", 13);

kde druhý argument nevyjadruje začiatočnú pozíciu od ktorej sa ma začať prehľadávať ale konečnú pozíciu!

Diskuze (0) Nahoru