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