Linux E X P R E S

Facebook

Programovanie v jazyku C++: Knižnica string – funkcia erase

C++

Hľadate funkciu, ktorá by vám umožnila mazať znaky alebo celé reťazce? Funkcia erase je na tento účel ako stvorená. 


Funkcia erase

Často sa môžte stretnúť s tým, že potrebujete zmazať nejaký znak alebo časť reťazca. Na rýchle a bezproblemové mazanie znakov slúži funkcia erase. Taktiež sa nemusíte obávať zmien veľkostí reťazca. Ako som aj v minulých dielách spomínal, objekty string si manažujú pamäť sami.

1. príklad: Jednoduchý príklad na funkciu erase

#include <iostream>   // hlavičkove subory
#include <string>

using namespace std;  // priestor mien

int main()
{
    string mojRetazec = "Chudak Plutto, uz nie je planetou!";

    cout << mojRetazec<<"\n";
    cout << "Upsik vidim tam chybicku krasy. Hned opravim!\n";

    mojRetazec.erase(mojRetazec.begin()+10);   // a mažeme znak

    cout << mojRetazec<<"\n";

    return 0;  // koniec programu
}

Výsledok programu:

Chudak Plutto, uz nie je planetou!
Upsik vidim tam chybicku krasy. Hned opravim!
Chudak Pluto, uz nie je planetou!

Rozbor programu:

Ukázali sme si jeden spôsob využitia funkcie erase. Ak chceme zmazať jeden znak, tak v argumente definujeme iterátor s pozíciou znaku, ktorý sa má zmazať.

V prvom príklade sme si ukázali prvý spôsob využitia funkcie erase. V druhom príklade si ukážeme ďalšie dve spôsoby.

2. príklad: Ďalšie využitia funkcie erase

#include <iostream>   // hlavičkove subory
#include <string>

using namespace std;  // priestor mien

int main()
{
    string retazec1 = "Kniha 1984 od Orwella nuti citatela zamysliet sa nad slobodou zvierat!";

    cout << retazec1<<"\n";
    cout << "Hm daco mi tu nesedi!\n";

    retazec1.erase(retazec1.size()-8, 8);
    retazec1.append("cloveka!");

    cout << retazec1 <<"\n\n";

    string retazec2 = "Zaklad mojej prace je ochrana nadpozemskeho zivota!";

    cout << retazec2<<"\n";

    retazec2.erase(retazec2.begin()+30, retazec2.begin()+33);

    cout << retazec2<<"\n";

    return 0;  // koniec programu
}

Výsledok programu:

Kniha 1984 od Orwella nuti citatela zamysliet sa nad slobodou zvierat!
Hm daco mi tu nesedi!
Kniha 1984 od Orwella nuti citatela zamysliet sa nad slobodou cloveka!

Zaklad mojej prace je ochrana nadpozemskeho zivota!
Zaklad mojej prace je ochrana pozemskeho zivota!

Rozbor programu:

V prvom využíti funkcie erase najprv definujeme pozíciu, odkiaľ máme v úmysle mazať znaky a v druhom argumente vyjadrujeme koľko znakov sa má zmazať od definovanej pozície.

V druhom využití využívame iterátory a to tak, že prvý iterátor vyjadruje začiatočný bod a druhý iterátor koncový bod.

Teraz by som navrhoval inšpirovať sa prvým príkladom a vylepšiť ho. Predsa, keď sa nato pozriete, tak vylepšenie môže prísť napríklad v tom, že program sám zistí, že idú za sebou dve rovnaké písmena.

3. príklad: Pridanie funkcionality do 1. príkladu

#include <iostream>   // hlavičkove subory
#include <string>

using namespace std;  // priestor mien

int main()
{
    string mojRetazec = "Chudak Plutto, uz nie je planetou!";

    cout << mojRetazec<<"\n";
    cout << "Upsik vidim tam chybicku krasy. Hned opravim!\n";

    for (size_t i = 0; i < mojRetazec.size(); i++)
    {
        if (mojRetazec[i] == mojRetazec[i+1])
        {
            mojRetazec.erase(mojRetazec.begin()+i);   
        }
    }

    cout << mojRetazec<<"\n";

    return 0;  // koniec programu
}

Výsledok programu:

Chudak Plutto, uz nie je planetou!
Upsik vidim tam chybicku krasy. Hned opravim!
Chudak Pluto, uz nie je planetou!

No a ešte na záver nejaký zaujímavejší príklad na zopakovanie.

4. príklad:

#include <iostream>   // hlavičkove subory
#include <string>

using namespace std;  // priestor mien

int main()
{
    string mojRetazec = "Nem,am holku, le,bo ,som leni.v,y chod.it do spol,ocnos,ti.";

    cout << mojRetazec<<"\n";

    for (size_t i = 0; i < mojRetazec.size(); i++)
    {
        if ((mojRetazec[i] == ',' && mojRetazec[i+1] != ' ') || (mojRetazec[i] == '.' && i != mojRetazec.size()-1))
        {
            mojRetazec.erase(mojRetazec.begin()+i);
        }
    }

    cout << mojRetazec<<"\n";

    return 0;  // koniec programu
}

Výsledok programu:

Nem,am holku, le,bo ,som leni.v,y chod.it do spol,ocnos,ti.
Nemam holku, lebo som lenivy chodit do spolocnosti.

Rozbor programu:

Všimnite si, že sme ošetrili nielen bodku na konci a ostatné bodky, ale aj rozlíšili medzi vhodnou a nevhodnou čiarkou. To, že by sme my sami (alebo užívateľ) zle zadali čiarku, ktorá by prešla podmienkou, je chyba medzi počítačom a stoličkou, nie programu.



Diskuze (0) Nahoru