Linux E X P R E S

Facebook

Programovanie v jazyku C++: Knižnica string – funkcia compare (1)

C++

V tomto článku sa pozrieme na funkciu compare s ktorou môžeme porovnávať reťazce. Rovnako si v článku rozoberieme trochu komplikovanejšie návrátove hodnoty funkcie compare . 


Funkcia compare

Ak chcete porovnať dve reťazce alebo vyhľadať podreťazec v reťazci, môžete využiť funkciu compare. Ukážme si jeden zo spôsobov využitia funkcie compare:

int num retazec1.compare(retazec2);

kde návratová hodnota funkcie compare je int. Návratová hodnota funkcie compare môže byť menšia ako 0, väčšia ako nula a rovná 0. Funkcia compare porovnáva jednotlivé znaky a podľa toho určuje výslednú návratovú hodnotu. O návratových hodnotách funkcie compare urobíme program, pretože interpretovať to, čo nám vracia nie je práve triviálne. Najčastejším využitím funkcie je rozhodnúť, či hľadaný reťazec resp. podreťazec sa nachádza v skúmanom reťazci.

1. príklad: Jednoduchý program na funkciu compare

#include <iostream>   // hlavickove subory
#include <string>
using namespace std;  // priestor mien

int main()
{
    string retazec1 = "Polarka";
    string retazec2 = "Polarka";
    int num1 = retazec1.compare(retazec2);
    if(num1 == 0)
        cout << "Jupi retazce su rovnake!\n";
    else cout << "Smola!\n";

    string retazec3 = "Proxima Centauri";
    string retazec4 = "Proxima Centauri";
    int num2 = retazec4.compare(retazec3);
    if(num2 != 0)
        cout << "Smola!\n";
    else cout << "Je to tam, retazce su rovnake!";
    return 0;  // koniec programu
}

Výsledok programu:

Jupi retazce su rovnake!
Je to tam, retazce su rovnake!

2. príklad: Návratové hodnoty funkcie compare

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

using namespace std;  // priestor mien

int main()
{
    string retazec1 = "Canopus";
    string retazec2 = "Canopus";
    int num1 = retazec1.compare(retazec2);
    int num2 = retazec2.compare(retazec1);
    cout << "num1: " << num1 << " num2: " << num2 << "\n";   // 1. test

    string retazec3 = "Banopus";
    string retazec4 = "Canopus";
    int num3 = retazec3.compare(retazec4);
    int num4 = retazec4.compare(retazec3);
    cout << "num3: " << num3 << " num4: " << num4 << "\n";   // 2. test

    string retazec5 = "Canopus";
    string retazec6 = "Aanopus";
    int num5 = retazec5.compare(retazec6);
    int num6 = retazec6.compare(retazec5);
    cout << "num5: " << num5 << " num6: " << num6 << "\n";   // 3. test

    string retazec7 = "Canopss";
    string retazec8 = "Canopvs";
    int num7 = retazec7.compare(retazec8);
    int num8 = retazec8.compare(retazec7);
    cout << "num7: " << num7 << " num8: " << num8 << "\n";   // 4. test

    string retazec9 = "Canrrrs";
    string retazec10 = "Canopus";
    int num9 = retazec9.compare(retazec10);
    int num10 = retazec10.compare(retazec9);
    cout << "num9: " << num9 << " num10: " << num10 << "\n";  // 5. test

    string retazec11 = "Canopus";
    string retazec12 = "CanoPus";
    int num11 = retazec11.compare(retazec12);
    int num12 = retazec12.compare(retazec11);
    cout << "num11: " << num11 << " num12: " << num12 << "\n";  // 6. test

    return 0;  // koniec programu
}

Výsledok programu:

num1: 0 num2: 0
num3: -1 num4: 1
num5: 1 num6: -1
num7: -1 num8: 1
num9: 1 num10: -1
num11: 1 num12: -1

Rozbor programu:

1. test - oba reťazce sú rovnaké, preto návratová hodnota je 0

2. test - porovnáva prvé znaky v oboch reťazcoch a vyhodnotí podľa toho, ktorý znak má väčšiu hodnotu v ASCII kóde. Ďalšie znaky funkciu compare nezaujíma, stačí prvý nesúlad medzi oboma reťazcami a vráti danú hodnotu. Keďže písmeno B je nižšie ako písmeno C v ASCII tabuľke, preto bude num3 < 0 a num4 > 0. A teraz k daným hodnotám. Pri každom objavení čo by len jedného nesúladu, vráti hodnotu -1 alebo 1.

Ešte poznámka, ak máme retazec1.compare(retazec2); tak to znamená, že reťazec1 je ten základný reťazec, ku ktorému sa porovnáva reťazec2. To len taká odbočka, pretože môže robiť trochu problémy zorientovať sa v tom, čo sa vlastne porovnáva a čo predstavujú tie návratové hodnoty.

3. test - znak A je menší ako znak C, preto num5 je kladná 1 a num6 -1.

4. test - nezáleží kde v reťazcoch vznikne nesúlad, platí že návratová hodnota sa odvíja od prvého nesúladu

5. test - ako vidíte, ani ďalšie rozdielne reťazce nezaujímajú, rozhoduje prvá nezrovnalosť

6. test – nezabudnite veľké P má menšiu ASCII hodnotu ako malé p

Diskuze (5) Nahoru