Porovnanie reťazcov: Programovanie C.

String Comparison C Programming



Reťazec v jazyku C je pole znakov, ktoré je ukončené nulovým znakom ( 0). Pomocou tejto vlastnosti sa porovnajú reťazce.







Dva reťazce je možné porovnávať rôznymi spôsobmi. V tomto tutoriáli najskôr uvidíme užívateľsky definovanú funkciu na porovnanie dvoch reťazcov a potom uvidíme niekoľko vstavaných funkcií knižnice, ktoré je možné veľmi ľahko použiť na porovnanie dvoch reťazcov. Začnime teda.



Porovnanie reťazcov pomocou funkcie definovanej používateľom:

Napíšeme funkciu stringCompare () porovnávať reťazce. Prechádzame reťazcami a porovnávame každý znak reťazca, kým sa nedostaneme na koniec jedného alebo oboch alebo sa nenájde jeden nesúlad. Ak je priechod dosiahnutý na koniec oboch reťazcov, potom sa reťazce zhodujú; v opačnom prípade sa reťazce nezhodujú.



01./*userDefinedFunction.c*/
02.
03.#zahrnúť
04.
05.intstringCompare( charstr1[ ], charstr2[ ] )
06.{
07.inti=0;
08.
09. kým(str1[i] ==str2[i] )
10.
pätnásť.
16.keby(str1[i] == ' 0' &&str2[i] == ' 0' )
17.vrátiť sa 0;
18.inak
19.vrátiť sa -1;
dvadsať.
dvadsaťjeden.}
22.
2. 3.
24.intHlavná()
25.{
26.charstr1[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.keby(stringCompare(str1,str2) == 0)
3. 4. printf („Reťazce sú rovnaké n');
35.inak
36. printf („Reťazce nie sú rovnaké n');
37.
38.vrátiť sa 0; 39.}





Tu prechádzame reťazcami pomocou cyklu while a premennej i . Keď sú znaky na rovnakej pozícii oboch reťazcov rovnaké, hodnota i sa zvýši o 1 (riadok 13). Ak znaky nie sú rovnaké (riadok 09) alebo sa dostaneme na koniec reťazca (riadok 11), potom je slučka while prerušením. Po slučke while skontrolujeme, či sú traverzy reťazcov dosiahnuté alebo nie (koniec riadku 16). Ak je priechod dosiahnutý na koniec oboch reťazcov, potom sú reťazce rovnaké, inak nie.

Porovnanie reťazcov pomocou vstavaných funkcií knižnice:

Na porovnanie reťazcov je možné použiť nasledujúce funkcie knižnice. Všetky funkcie sú deklarované v súbore reťazec.h hlavičkový súbor.



funkcia strcmp ():

Táto funkcia porovnáva dva reťazce odovzdané funkcii.

Syntax :

int strcmp (konšt char *str1, konšt char *str2)

Návratová hodnota: Ak sú reťazce rovnaké, vráťte 0. Vráťte záporné celé číslo, ak je hodnota ASCII prvého bezkonkurenčného znaku prvého reťazca menšia ako druhý reťazec. Ak je hodnota ASCII prvého bezkonkurenčného znaku prvého reťazca väčšia ako druhý reťazec, vráti kladné celé číslo. Niektoré systémy vracajú rozdiel hodnoty ASCII prvého nezhodujúceho sa znaku a niektoré systémy vracajú -1, ak je hodnota ASCII prvého nepriradeného znaku prvého reťazca menšia ako druhý reťazec a vráti hodnotu 1, ak je hodnota ASCII prvého neporovnateľného znaku prvý reťazec je väčší ako druhý reťazec.

Príklad Návratová hodnota Vysvetlenie
strcmp ( Hello World, Hello World ) 0 Dve struny sú rovnaké.
strcmp ( Dobrý deň, ahoj 0 svet ) 0 Reťazce sa porovnávajú až po znak „ 0“. Prvý reťazec sa predvolene končí na „ 0“ a druhý reťazec obsahuje znak „ 0“ po „ahoj“.
strcmp ( Dobrý deň 0 0 0 ″, Hello 0 World ) 0 Reťazce sa porovnávajú až po znak „ 0“.
strcmp ( Ahoj Svet, ahoj Svet ) Záporné celé číslo Hodnota ASCII prvého bezkonkurenčného znaku prvého reťazca („H“) je menšia ako druhý reťazec („h“)
strcmp ( ahoj svet, ahoj svet ) Kladné celé číslo Hodnota ASCII prvého bezkonkurenčného znaku prvého reťazca („h“) je väčšia ako druhý reťazec („H“)

funkcia strncmp ():

Táto funkcia je podobná funkcii strcmp () , ale tu musíme špecifikovať, koľko bajtov sa porovnáva, tým, že funkcii predáme ďalší argument.

Syntax:

int strncmp (konšt char *str1, konšt char *str2, veľkosť_tn)

Návratová hodnota: Funkcia sa vráti 0 ak 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 ( Ahoj, ahoj 0 Svet, 5 ) 0 Prvých 5 znakov je rovnakých.
strncmp ( Ahoj 0 0 0 ″, Hello 0 World, 8 ) 0 „ 0“ je za prvých 5 znakov v oboch reťazcoch. Porovnávanie sa teda zastaví po 5, nie 8.
strncmp ( Hello World, hello World, 5 ) Záporné celé číslo Hodnota ASCII prvého bezkonkurenčného znaku prvého reťazca („H“) je menšia ako druhý reťazec („h“)

funkcia strcasecmp ():

Táto funkcia je podobná funkcii strcmp () , ale v reťazcoch sa nerozlišujú malé a veľké písmená.

Syntax:

intstrcasecmp(konšt char *str1, konšt char *str2)

Návratová hodnota: Rovnaké ako strcmp () , ale so strunami sa zaobchádza ako rozlišujú sa malé a veľké písmená .

Príklad Návratová hodnota Vysvetlenie
strcasecmp ( Hello World, Hello World ) 0 Dve struny sú rovnaké.
strcasecmp ( Dobrý deň, ahoj 0 svet ) 0 Reťazce sa porovnávajú až po znak „ 0“. Prvý reťazec v predvolenom nastavení končí ' 0' a druhý reťazec obsahuje znak ' 0' po 'Hello'.
strcasecmp ( Ahoj Svet, ahoj Svet ) 0 Struny sú rozlišujú sa malé a veľké písmená. Hello World a Hello World sú rovnaké.

funkcia strncasecmp ():

Táto funkcia je podobná funkcii strncmp () , ale v reťazcoch sa nerozlišujú malé a veľké písmená.

Syntax:

intstrncasecmp(konšt char *str1, konšt char *str2)

Návratová hodnota: Rovnaké ako strncmp () , keď sú reťazce považované za citlivé na veľkosť písmen.

Príklad Návratová hodnota Vysvetlenie
strncasecmp ( Hello World, Hello World, 5 ) 0 Prvých 5 znakov je rovnakých.
strncasecmp ( Ahoj, ahoj 0 Svet, 5 ) 0 Prvých 5 znakov je rovnakých.
strncasecmp ( Ahoj 0 0 0 ″, Hello 0 World, 8 ) 0 „ 0“ je za prvých 5 znakov v oboch reťazcoch. Porovnávanie sa teda zastaví po 5, nie 8.
strncasecmp ( Hello World, hello World, 5 ) 0 Struny sú rozlišujú sa malé a veľké písmená. Ahoj a ahoj sú teda rovnakí.

funkcia memcmp ():

Táto funkcia porovnáva dva pamäťové bloky bajt po bajte. Na porovnanie musíme odovzdať dva ukazovatele pamäťových blokov a počet bajtov.

Syntax:

int memcmp (konšt prázdny *str1, konšt prázdny *str2, veľkosť_tn)

Návratová hodnota: Funkcia vráti 0, ak dva pamäťové bloky ( n bajty) sú rovnaké; v opačnom prípade vráti rozdiely medzi prvou nezhodnou dvojicou bajtov (bajty sa interpretujú ako objekty znakov bez znamienka a 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 ( Ahoj 0 0 0 ″, Hello 0 World, 8 ) Záporné celé číslo Prvých 6 znakov je rovnakých, ale siedmy znak je iný. Tu sa porovnávanie nezastavilo strncmp () keď získate znak „ 0“.
memcmp ( Hello World, hello World, 11 ) Záporné celé číslo Hodnota ASCII prvého bezkonkurenčného znaku prvého reťazca („H“) je menšia ako druhý reťazec („h“)

Príklad:

Nasleduje príklad kódu C všetkých diskutovaných funkcií.

01./*stringCompare.c*/
02.
03.#zahrnúť
04.#zahrnúť
05.
06.intHlavná()
07.{
08. printf ('strcmp ('Ahoj Svet','Ahoj Svet') => %d n', strcmp ( 'Hello World','Hello World' ));
09. printf ('strcmp ('Ahoj','Ahoj\0Svet') => %d n', strcmp ( 'Ahoj','Ahoj 0Svet ' ));
10. printf ('strcmp ('Ahoj Svet','ahoj svet') => %d n', strcmp ( 'Hello World','ahoj svet' ) );
jedenásť. printf ('strcmp ('Ahoj\0\0\0','Ahoj\0Svet') => %d n', strcmp ( 'Ahoj 0 0 0','Ahoj 0Svet ' ));
12.
13. printf (' n--------------- n');
14.
pätnásť. printf ('strncmp ('Ahoj Svet','Ahoj Svet', 5) => %d n', strncmp ( 'Hello World','Hello World',5 ));
16. printf ('strncmp ('Ahoj','Ahoj\0Svet', 5) => %d n', strncmp ( 'Ahoj','Ahoj 0Svet ',5 ));
17. printf ('strncmp ('Ahoj\0\0\0','Ahoj\0Svet', 8) => %d n', strncmp ( 'Ahoj 0 0 0','Ahoj 0Svet ',8 ));
18. printf ('strncmp ('Ahoj Svet','ahoj svet', 5) => %d n', strncmp ( 'Hello World','ahoj svet',5 ));
19.
dvadsať. printf (' n--------------- n');
dvadsaťjeden.
22. printf ('strcasecmp ('Ahoj Svet','Ahoj Svet') => %d n',strcasecmp( 'Hello World','Hello World' ));
2. 3. printf ('strcasecmp ('Ahoj','Ahoj\0Svet') => %d n',strcasecmp( 'Ahoj','Ahoj 0Svet ' ));
24. printf ('strcasecmp ('Ahoj Svet','ahoj svet') => %d n',strcasecmp( 'Hello World','ahoj svet' ));
25.
26. printf (' n--------------- n');
27.
28. printf ('strncasecmp ('Ahoj Svet','Ahoj Svet', 5) => %d n',strncasecmp( 'Hello World','Hello World',5 ) );
29. printf ('strncasecmp ('Ahoj','Ahoj\0Svet', 5) => %d n',strncasecmp( 'Ahoj','Ahoj 0Svet ',5 ));
30. printf ('strncasecmp ('Ahoj\0\0\0','Ahoj\0Svet', 8) => %d n',strncasecmp( 'Ahoj 0 0 0','Ahoj 0Svet ',8 ));
31. printf ('strncasecmp ('Ahoj Svet','ahoj svet', 5) => %d n',strncasecmp( 'Hello World','ahoj svet',5 ));
32.
33. printf (' n--------------- n');
3. 4.
35. printf ('memcmp ('Ahoj Svet','Ahoj Svet', 5) => %d n', memcmp ( 'Hello World','Hello World',5 ) );
36. printf ('memcmp ('Ahoj\0\0\0','Ahoj\0Svet', 8) => %d n', memcmp ( 'Ahoj 0 0 0','Ahoj 0Svet ',8 ));
37. printf ('memcmp ('Ahoj Svet','ahoj svet', 11) => %d n', memcmp ( 'Hello World','ahoj svet',jedenásť ));
38.
39.vrátiť sa 0; 40.}

Záver:

V tomto návode sme teda videli, ako je možné reťazce porovnávať rôznymi spôsobmi. Ako sme videli, funkcia stringCompare () vracia -1 pre nerovnaké reťazce, ale toto je možné upraviť tak, aby vracalo hodnotu ASCII nesúladného znaku. Môžete ho použiť vo svojom kóde, ktorý je pre vás najvhodnejší.