Primerjava nizov: C programiranje

String Comparison C Programming



Niz v jeziku C je niz znakov, ki je zaključen z ničelnim znakom ( 0). Z uporabo te lastnosti se primerjajo nizi.







Dva niza lahko primerjamo na različne načine. V tej vadnici bomo najprej videli uporabniško definirano funkcijo za primerjavo dveh nizov, nato pa bomo videli nekaj vgrajenih knjižničnih funkcij, ki jih lahko zelo enostavno primerjamo. Torej, začnimo.



Primerjava nizov z uporabniško določeno funkcijo:

Napisali bomo funkcijo stringCompare () za primerjavo nizov. Prečkamo nize in primerjamo vsak znak niza, dokler ne pridemo do konca enega ali pa najdemo oba ali eno neusklajeno. Če je prehod dosežen do konca obeh nizov, se nizi ujemajo; v nasprotnem primeru se nizi ne ujemajo.



01./*userDefinedFunction.c*/
02.
03.#vključi
04.
05.intstringCompare( charstr1[ ], charstr2[ ] )
06.{
07.intjaz=0;
08.
09. medtem(str1[jaz] ==str2[jaz] )
10.
petnajst.
16.če(str1[jaz] == ' 0' &&str2[jaz] == ' 0' )
17.vrnitev 0;
18.drugače
19.vrnitev -1;
dvajset.
enaindvajset.}
22.
2. 3.
24.intglavni()
25.{
26.charstr1[30],str2[30];
27.
28. printf ('Vnesite prvi niz:');
29. scanf ('% [^ n]% * c ',str1);
30. printf ('Vnesite drugi niz:');
31. scanf ('% [^ n]% * c ',str2);
32.
33.če(stringCompare(str1,str2) == 0)
3. 4. printf ('Strune so enake n');
35.drugače
36. printf („Strune niso enake n');
37.
38.vrnitev 0; 39.}





Tu prečkamo nize z uporabo zanke while in spremenljivke jaz . Ko sta znaka na istem mestu obeh nizov enaka, je vrednost jaz se poveča za 1 (vrstica 13). Če znaki niso enaki (vrstica 09) ali pridemo do konca niza (vrstica 11), je zanka while prelom. Po zanki while preverimo, da sta oba prehoda niza dosežena do konca ali ne (vrstica 16). Če je prehod dosežen do konca obeh nizov, so nizi enaki, sicer ne.

Primerjava nizov z vgrajenimi knjižničnimi funkcijami:

Za primerjavo nizov lahko uporabite naslednje knjižnične funkcije. Vse funkcije so deklarirane v niz.h naslovno datoteko.



funkcija strcmp ():

Ta funkcija primerja dva niza, posredovana funkciji.

Sintaksa :

int strcmp (const char *str1, const char *str2)

Vrnjena vrednost: Vrnite 0, če so nizi enaki. Vrnite negativno celo število, če je vrednost ASCII prvega neusklajenega znaka prvega niza manjša od drugega niza. Vrnite pozitivno celo število, če je vrednost ASCII prvega neusklajenega znaka prvega niza večja od drugega niza. Nekateri sistemi vrnejo razliko vrednosti ASCII prvega neusklajenega znaka, nekateri pa vrnejo -1, če je vrednost ASCII prvega neustreznega znaka prvega niza manjša od drugega niza in vrne 1, če je vrednost ASCII prvega neustreznega znaka prvi niz je večji od drugega niza.

Primer Vrnjena vrednost Pojasnilo
strcmp ( Pozdravljeni svet, pozdravljen svet ) 0 Dve struni sta enaki.
strcmp ( Pozdravljeni, Pozdravljeni 0 Svet ) 0 Niz se primerjata do znaka ' 0'. Prvi niz se privzeto konča z ' 0', drugi niz pa za 'Hello' vsebuje znak ' 0'.
strcmp ( Pozdravljeni 0 0 0 ″, Pozdravljeni 0 Svet ) 0 Niz se primerjata do znaka ' 0'.
strcmp ( Pozdravljeni svet, zdravo svet ) Negativno celo število Vrednost ASCII prvega neusklajenega znaka prvega niza ('H') je manjša od drugega niza ('h')
strcmp ( pozdravljen svet, pozdravljen svet ) Pozitivno celo število Vrednost ASCII prvega neusklajenega znaka prvega niza ('h') je večja od drugega niza ('H')

funkcija strncmp ():

Ta funkcija je podobna funkciji strcmp () , tukaj pa moramo podati dodaten argument funkciji, koliko bajtov primerjamo.

Sintaksa:

int strncmp (const char *str1, const char *str2, velikost_tn)

Vrnjena vrednost: Funkcija se vrne 0 če prvi n znaki obeh nizov so enaki; v nasprotnem primeru vrne negativno ali pozitivno celo število, odvisno od predznaka razlik med vrednostjo ASCII prvega neusklajenega znaka.

Primer Vrnjena vrednost Pojasnilo
strncmp ( Pozdravljeni svet, pozdravljen svet, 5 ) 0 Prvih 5 znakov je enakih.
strncmp ( Pozdravljeni, Pozdravljeni 0 Svet, 5 ) 0 Prvih 5 znakov je enakih.
strncmp ( Pozdravljeni 0 0 0 ″, Pozdravljeni 0 Svet, 8 ) 0 ' 0' je za prvimi petimi znaki v obeh nizih. Torej se primerjava ustavi po 5 in ne 8.
strncmp ( Pozdravljeni svet, zdravo svet, 5 ) Negativno celo število Vrednost ASCII prvega neusklajenega znaka prvega niza ('H') je manjša od drugega niza ('h')

funkcija strcasecmp ():

Ta funkcija je podobna funkciji strcmp () , vendar tukaj nizi ne razlikujejo med velikimi in malimi črkami.

Sintaksa:

intstrcasecmp(const char *str1, const char *str2)

Vrnjena vrednost: Enako kot strcmp () , nizi pa se obravnavajo kot velike in male črke .

Primer Vrnjena vrednost Pojasnilo
strcasecmp ( Pozdravljeni svet, pozdravljen svet ) 0 Dve struni sta enaki.
strcasecmp ( Pozdravljeni, Pozdravljeni 0 Svet ) 0 Niz se primerjata do znaka ' 0'. Prvi niz se privzeto konča z ' 0', drugi niz pa za 'Hello' vsebuje znak ' 0'.
strcasecmp ( Pozdravljeni svet, zdravo svet ) 0 Strune so velike in male črke Torej, Hello World in hello World sta enaka.

funkcija strncasecmp ():

Ta funkcija je podobna funkciji strncmp () , vendar tukaj nizi ne razlikujejo med velikimi in malimi črkami.

Sintaksa:

intstrncasecmp(const char *str1, const char *str2)

Vrnjena vrednost: Enako kot strncmp () , ko se nize obravnavajo kot velike in male črke.

Primer Vrnjena vrednost Pojasnilo
strncasecmp ( Pozdravljeni svet, pozdravljen svet, 5 ) 0 Prvih 5 znakov je enakih.
strncasecmp ( Pozdravljeni, Pozdravljeni 0 Svet, 5 ) 0 Prvih 5 znakov je enakih.
strncasecmp ( Pozdravljeni 0 0 0 ″, Pozdravljeni 0 Svet, 8 ) 0 ' 0' je za prvimi petimi znaki v obeh nizih. Torej se primerjava ustavi po 5 in ne 8.
strncasecmp ( Pozdravljeni svet, zdravo svet, 5 ) 0 Strune so velike in male črke Torej, Hello in hello sta enaka.

funkcija memcmp ():

Ta funkcija primerja dva pomnilniška bloka po bajtih. Prenesti moramo dva kazalca pomnilniških blokov in število bajtov za primerjavo.

Sintaksa:

int memcmp (const nično *str1, const nično *str2, velikost_tn)

Vrnjena vrednost: Funkcija vrne 0, če dva pomnilniška bloka ( n bajti) so enaki; v nasprotnem primeru vrne razlike med prvim neusklajenim parom bajtov (bajti se razlagajo kot brezznačni objekti char, nato pa se povišajo v int).

Primer Vrnjena vrednost Pojasnilo
memcmp ( Pozdravljeni svet, pozdravljen svet, 5 ) 0 Prvih 5 znakov je enakih.
memcmp ( Pozdravljeni 0 0 0 ″, Pozdravljeni 0 Svet, 8 ) Negativno celo število Prvih 6 znakov je enako, sedmi znak pa je drugačen. Tu se primerjava ni ustavila strncmp () ko dobite znak ' 0'.
memcmp ( Pozdravljeni svet, zdravo svet, 11 ) Negativno celo število Vrednost ASCII prvega neusklajenega znaka prvega niza ('H') je manjša od drugega niza ('h')

Primer:

Sledi primer C kode vseh obravnavanih funkcij.

01./*stringCompare.c*/
02.
03.#vključi
04.#vključi
05.
06.intglavni()
07.{
08. printf ('strcmp ('Pozdravljen, svet','Pozdravljen, svet') => %d n', strcmp ( 'Pozdravljen, svet','Pozdravljen, svet' ));
09. printf ('strcmp ('zdravo','Zdravo\0Svet') => %d n', strcmp ( 'Zdravo','Zdravo 0Svet ' ));
10. printf ('strcmp ('Pozdravljen, svet','Pozdravljen, svet') => %d n', strcmp ( 'Pozdravljen, svet','Pozdravljen, svet' ) );
enajst. printf ('strcmp ('Zdravo\0\0\0','Zdravo\0Svet') => %d n', strcmp ( 'Zdravo 0 0 0','Zdravo 0Svet ' ));
12.
13. printf (' n--------------- n');
14.
petnajst. printf ('strncmp ('Pozdravljen, svet','Pozdravljen, svet', 5) => %d n', strncmp ( 'Pozdravljen, svet','Pozdravljen, svet',5 ));
16. printf ('strncmp ('zdravo','Zdravo\0Svet', 5) => %d n', strncmp ( 'Zdravo','Zdravo 0Svet ',5 ));
17. printf ('strncmp ('Zdravo\0\0\0','Zdravo\0Svet', 8) => %d n', strncmp ( 'Zdravo 0 0 0','Zdravo 0Svet ',8 ));
18. printf ('strncmp ('Pozdravljen, svet','Pozdravljen, svet', 5) => %d n', strncmp ( 'Pozdravljen, svet','Pozdravljen, svet',5 ));
19.
dvajset. printf (' n--------------- n');
enaindvajset.
22. printf ('strcasecmp ('Pozdravljen, svet','Pozdravljen, svet') => %d n',strcasecmp( 'Pozdravljen, svet','Pozdravljen, svet' ));
2. 3. printf ('strcasecmp ('zdravo','Zdravo\0Svet') => %d n',strcasecmp( 'Zdravo','Zdravo 0Svet ' ));
24. printf ('strcasecmp ('Pozdravljen, svet','Pozdravljen, svet') => %d n',strcasecmp( 'Pozdravljen, svet','Pozdravljen, svet' ));
25.
26. printf (' n--------------- n');
27.
28. printf ('strncasecmp ('Pozdravljen, svet','Pozdravljen, svet', 5) => %d n',strncasecmp( 'Pozdravljen, svet','Pozdravljen, svet',5 ) );
29. printf ('strncasecmp ('zdravo','Zdravo\0Svet', 5) => %d n',strncasecmp( 'Zdravo','Zdravo 0Svet ',5 ));
30. printf ('strncasecmp ('Zdravo\0\0\0','Zdravo\0Svet', 8) => %d n',strncasecmp( 'Zdravo 0 0 0','Zdravo 0Svet ',8 ));
31. printf ('strncasecmp ('Pozdravljen, svet','Pozdravljen, svet', 5) => %d n',strncasecmp( 'Pozdravljen, svet','Pozdravljen, svet',5 ));
32.
33. printf (' n--------------- n');
3. 4.
35. printf ('memcmp ('Pozdravljen, svet','Pozdravljen, svet', 5) => %d n', memcmp ( 'Pozdravljen, svet','Pozdravljen, svet',5 ) );
36. printf ('memcmp ('Zdravo\0\0\0','Zdravo\0Svet', 8) => %d n', memcmp ( 'Zdravo 0 0 0','Zdravo 0Svet ',8 ));
37. printf ('memcmp ('Pozdravljen, svet','Pozdravljen, svet', 11) => %d n', memcmp ( 'Pozdravljen, svet','Pozdravljen, svet',enajst ));
38.
39.vrnitev 0; 40.}

Zaključek:

Tako smo v tej vadnici videli, kako lahko nizove primerjamo na različne načine. Kot smo videli, funkcija stringCompare () vrne -1 za neenake nize, vendar jo je mogoče spremeniti tako, da vrne vrednost ASCII z neusklajenim znakom. Uporabite ga lahko v svoji kodi, ki vam najbolj ustreza.