C Programovanie

Programovanie porovnania reťazcov C

Programovanie porovnania reťazcov C
Reťazec v jazyku C je pole znakov, ktoré je ukončené prázdnym znakom (\ 0). Pomocou tejto vlastnosti sa porovnávajú reťazce.

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ší.

Hry HD remasterované hry pre Linux, ktoré nikdy predtým nemali vydanie Linuxu
HD remasterované hry pre Linux, ktoré nikdy predtým nemali vydanie Linuxu
Mnoho vývojárov a vydavateľov hier prichádza s remastrom starých hier v rozlíšení HD, aby predĺžili životnosť franšízy. Prosím fanúšikov, ktorí požadu...
Hry Ako používať AutoKey na automatizáciu hier pre Linux
Ako používať AutoKey na automatizáciu hier pre Linux
AutoKey je obslužný program na automatizáciu stolných počítačov pre systémy Linux a X11, programovaný v programoch Python 3, GTK a Qt. Pomocou jeho fu...
Hry Ako zobraziť počítadlo FPS v hrách Linux
Ako zobraziť počítadlo FPS v hrách Linux
Hranie na systéme Linux získalo veľký tlak, keď spoločnosť Valve v roku 2012 oznámila podporu systému Linux pre klienta Steam a ich hry. Od tej doby s...