Dve struny je možné porovnať rôznymi spôsobmi. V tomto výučbe najskôr uvidíme používateľom definovanú funkciu na porovnanie dvoch reťazcov a potom uvidíme niektoré vstavané knižničné funkcie, pomocou ktorých je možné veľmi ľahko porovnať dva reťazce. Takže poďme na to.
Porovnanie reťazcov pomocou používateľom definovanej funkcie:
Napíšeme funkciu stringCompare () na porovnanie strún. Prejdeme po reťazcoch a porovnáme každý znak reťazca, až kým sa nedostaneme na koniec jedného alebo oboch, alebo sa nenájde jeden nesúlad. Ak sa dosiahne traverz na koniec oboch strún, potom sa struny spárujú; v opačnom prípade sa reťazce nezhodujú.
01. / * userDefinedFunction.c * /02.
03. #include
04.
05. int stringCompare (char str1 [], char str2 [])
06.
07. int i = 0;
08.
09. while (str1 [i] == str2 [i])
10.
11. if (str1 [i] == '\ 0' || str2 [i] == '\ 0')
12. prestávka;
13. i ++;
14.
15.
16. if (str1 [i] == '\ 0' && str2 [i] == '\ 0')
17. návrat 0;
18. inak
19. návrat -1;
20.
21.
22.
23.
24. int main ()
25.
26. char str1 [30], str2 [30];
27.
28. printf ("Zadajte prvý reťazec:");
29. scanf ("% [^ \ n]% * c", str1);
30. printf ("Zadajte druhý reťazec:");
31. scanf ("% [^ \ n]% * c", str2);
32.
33. if (stringCompare (str1, str2) == 0)
34. printf ("Reťazce sú rovnaké \ n");
35. inak
36. printf ("Reťazce nie sú rovnaké \ n");
37.
38. návrat 0; 39.
Tu prechádzame reťazce pomocou cyklu while a premennej i. Keď sú znaky rovnaké na rovnakej pozícii oboch reťazcov, hodnota i sa zvyšuje o 1 (riadok 13). Ak znaky nie sú rovnaké (riadok 09) alebo sa dostaneme na koniec reťazca (riadok 11), potom je cyklus while prerušením. Po cykle while skontrolujeme, či sú obidva priechody reťazcov dosiahnuté na koniec alebo nie (riadok 16). Ak je priechod dosiahnutý na koniec oboch reťazcov, potom sú reťazce rovnaké, inak nie.
Porovnanie reťazcov pomocou zabudovaných funkcií knižnice:
Na porovnanie reťazcov je možné použiť nasledujúce funkcie knižnice. Všetky funkcie sú deklarované v struna.h hlavičkový súbor.
funkcia strcmp ():
Táto funkcia porovnáva dva reťazce odovzdané funkcii.
Syntax:
int strcmp (const char * str1, const char * str2)Návratová hodnota: Ak sú reťazce rovnaké, vráťte hodnotu 0. Ak je hodnota ASCII prvého nezhodného znaku prvého reťazca menšia ako druhý reťazec, vráťte záporné celé číslo. Vrátiť kladné celé číslo, ak je hodnota ASCII prvého nezhodného znaku prvého reťazca väčšia ako druhý reťazec. Niektoré systémy vrátia rozdiel hodnoty ASCII prvého nezhodného znaku a niektoré systémy vrátia -1, ak je hodnota ASCII prvého nezhodného znaku prvého reťazca menšia ako druhý reťazec a vráti 1, ak je hodnota ASCII prvého nezhodného znaku prvý reťazec je väčší ako druhý reťazec.
Príklad | Návratová hodnota | Vysvetlenie |
strcmp ( „Hello World“, „Hello World“ ) | 0 | Dva reťazce sú rovnaké. |
strcmp ( „Hello“, „Hello \ 0 World“ ) | 0 | Reťazce sa porovnávajú až po znak '\ 0'. Prvý reťazec sa štandardne končí znakom „\ 0“ a druhý reťazec obsahuje znak „\ 0“ za znakom „Hello“. |
strcmp ( „Hello \ 0 \ 0 \ 0", „Hello \ 0 World" ) | 0 | Reťazce sa porovnávajú až po znak '\ 0'. |
strcmp ( „Hello World“, „ahoj svet“ ) | Záporné celé číslo | Hodnota ASCII prvého nezhodného znaku prvého reťazca („H“) je menšia ako druhého reťazca („h“) |
strcmp („Ahoj svet“, „ahoj svet“ ) | Kladné celé číslo | Hodnota ASCII prvého nezhodného znaku prvého reťazca („h“) je väčšia ako druhého reťazca („H“) |
funkcia strncmp ():
Táto funkcia je podobná funkcii strcmp (), ale tu musíme určiť, koľko bajtov sa porovnáva, a to tak, že funkcii odovzdáme ďalší argument.
Syntax:
int strncmp (const char * str1, const char * str2, size_t n)Návratová hodnota: Funkcia sa vráti 0 ako prvý n znaky dvoch reťazcov sú rovnaké; v opačnom prípade vráti záporné alebo kladné celé číslo v závislosti od znamienka rozdielov medzi hodnotou ASCII prvého nezhodného znaku.
Príklad | Návratová hodnota | Vysvetlenie |
strncmp ( „Hello World“, „Hello World“, 5 ) | 0 | Prvých 5 znakov je rovnakých. |
strncmp ( „Hello“, „Hello \ 0 World“, 5 ) | 0 | Prvých 5 znakov je rovnakých. |
strncmp ( „Hello \ 0 \ 0 \ 0", "Hello \ 0 World", 8 ) | 0 | „\ 0“ je za prvými 5 znakmi v oboch reťazcoch. Porovnanie sa teda zastaví po 5, nie 8. |
strncmp ( „Hello World“, „ahoj svet“, 5 ) | Záporné celé číslo | Hodnota ASCII prvého nezhodného znaku prvého reťazca („H“) je menšia ako druhého reťazca („h“) |
funkcia strcasecmp ():
Táto funkcia je podobná funkcii strcmp (), ale tu reťazce nerozlišujú veľké a malé písmená.
Syntax:
int strcasecmp (const char * str1, const char * str2)Návratová hodnota: Rovnaké ako strcmp (), ale s reťazcami sa zaobchádza ako s rozlišujú sa veľké a malé písmená.
Príklad | Návratová hodnota | Vysvetlenie |
strcasecmp ( „Hello World“, „Hello World“ ) | 0 | Dva reťazce sú rovnaké. |
strcasecmp ( „Hello“, „Hello \ 0 World“ ) | 0 | Reťazce sa porovnávajú až po znak '\ 0'. Prvý reťazec sa štandardne končí znakom „\ 0“ a druhý reťazec obsahuje znak „\ 0“ za znakom „Hello“. |
strcasecmp ( „Hello World“, „ahoj svet“ ) | 0 | Struny sú rozlišujú sa veľké a malé písmená. Takže „Hello World“ a „hello World“ sú rovnaké. |
funkcia strncasecmp ():
Táto funkcia je podobná funkcii strncmp (), ale tu reťazce nerozlišujú veľké a malé písmená.
Syntax:
int strncasecmp (const char * str1, const char * str2)Návratová hodnota: Rovnaké ako strncmp (), keď sa s reťazcami zaobchádza ako s malými a veľkými písmenami.
Príklad | Návratová hodnota | Vysvetlenie |
strncasecmp ( „Hello World“, „Hello World“, 5 ) | 0 | Prvých 5 znakov je rovnakých. |
strncasecmp ( „Hello“, „Hello \ 0 World“, 5 ) | 0 | Prvých 5 znakov je rovnakých. |
strncasecmp ( „Hello \ 0 \ 0 \ 0", "Hello \ 0 World", 8 ) | 0 | „\ 0“ je po prvých 5 znakoch v oboch reťazcoch. Porovnanie sa teda zastaví po 5, nie 8. |
strncasecmp ( „Hello World“, „ahoj svet“, 5 ) | 0 | Struny sú rozlišujú sa veľké a malé písmená. „Ahoj“ a „ahoj“ sú teda rovnaké. |
funkcia memcmp ():
Táto funkcia porovnáva dva pamäťové bloky po bajtoch. Musíme odovzdať dva ukazovatele pamäťových blokov a počet bajtov na porovnanie.
Syntax:
int memcmp (const void * str1, const void * str2, size_t n)Návratová hodnota: Funkcia vráti 0, ak sú dva bloky pamäte (n bajty) sú rovnaké; inak vráti rozdiely medzi prvou nezhodnou dvojicou bajtov (bajty sa interpretujú ako nepodpísané char objekty, potom sa povýšia na int).
Príklad | Návratová hodnota | Vysvetlenie |
memcmp ( „Hello World“, „Hello World“, 5 ) | 0 | Prvých 5 znakov je rovnakých. |
memcmp ( „Hello \ 0 \ 0 \ 0", "Hello \ 0 World", 8 ) | Záporné celé číslo | Prvých 6 znakov je rovnakých, ale 7. znak je iný. Tu sa porovnanie nezastavilo strncmp () pri získavaní znaku „\ 0“. |
memcmp ( „Hello World“, „ahoj svet“, 11 ) | Záporné celé číslo | Hodnota ASCII prvého nezhodného znaku prvého reťazca („H“) je menšia ako druhého reťazca („h“) |
Príklad:
Nasleduje príklad kódu C všetkých diskutovaných funkcií.
01. / * stringPorovnať.c * /02.
03. #include
04. #include
05.
06. int main ()
07.
08. printf ("strcmp (" Hello World "," Hello World ") =>% d \ n", strcmp ("Hello World", "Hello World"));
09. printf ("strcmp (" Hello "," Hello \\ 0 World ") =>% d \ n", strcmp ("Hello", "Hello \ 0 World"));
10. printf ("strcmp (" Hello World "," hello World ") =>% d \ n", strcmp ("Hello World", "hello World"));
11. printf ("strcmp (" Hello \\ 0 \\ 0 \\ 0 "," Hello \\ 0 World ") =>% d \ n", strcmp ("Hello \ 0 \ 0 \ 0", "Hello \ 0" Svet "));
12.
13. printf ("\ n --------------- \ n");
14.
15. printf ("strncmp (" Hello World "," Hello World ", 5) =>% d \ n", strncmp ("Hello World", "Hello World", 5));
16. printf ("strncmp (" Hello "," Hello \\ 0 World ", 5) =>% d \ n", strncmp ("Hello", "Hello \ 0 World", 5));
17. printf ("strncmp (" Hello \\ 0 \\ 0 \\ 0 "," Hello \\ 0 World ", 8) =>% d \ n", strncmp ("Hello \ 0 \ 0 \ 0", "Hello \ 0 Svet ", 8));
18. printf ("strncmp (" Hello World "," hello World ", 5) =>% d \ n", strncmp ("Hello World", "hello World", 5));
19.
20. printf ("\ n --------------- \ n");
21.
22. printf ("strcasecmp (" Hello World "," Hello World ") =>% d \ n", strcasecmp ("Hello World", "Hello World"));
23. printf ("strcasecmp (" Hello "," Hello \\ 0 World ") =>% d \ n", strcasecmp ("Hello", "Hello \ 0 World"));
24. printf ("strcasecmp (" Hello World "," hello World ") =>% d \ n", strcasecmp ("Hello World", "hello World"));
25.
26. printf ("\ n --------------- \ n");
27.
28. printf ("strncasecmp (" Hello World "," Hello World ", 5) =>% d \ n", strncasecmp ("Hello World", "Hello World", 5));
29. printf ("strncasecmp (" Hello "," Hello \\ 0 World ", 5) =>% d \ n", strncasecmp ("Hello", "Hello \ 0 World", 5));
30. printf ("strncasecmp (" Hello \\ 0 \\ 0 \\ 0 "," Hello \\ 0 World ", 8) =>% d \ n", strncasecmp ("Hello \ 0 \ 0 \ 0", "Hello \ 0 Svet ", 8));
31. printf ("strncasecmp (" Hello World "," hello World ", 5) =>% d \ n", strncasecmp ("Hello World", "hello World", 5));
32.
33. printf ("\ n --------------- \ n");
34.
35. printf ("memcmp (" Hello World "," Hello World ", 5) =>% d \ n", memcmp ("Hello World", "Hello World", 5));
36. printf ("memcmp (" Hello \\ 0 \\ 0 \\ 0 "," Hello \\ 0 World ", 8) =>% d \ n", memcmp ("Hello \ 0 \ 0 \ 0", "Hello \ 0 Svet ", 8));
37. printf ("memcmp (" Hello World "," hello World ", 11) =>% d \ n", memcmp ("Hello World", "hello World", 11));
38.
39. návrat 0; 40.
Záver:
V tomto tutoriáli sme teda videli, ako sa dajú reťazce rôzne porovnávať. Ako sme videli, funkcia stringCompare () vráti -1 pre nerovnaké reťazce, ale dá sa to upraviť tak, aby vrátila hodnotu ASCII nezhodného znaku. Môžete ho použiť vo svojom kóde, ktorý je pre vás najvhodnejší.