Porovnání řetězců: Programování C.

String Comparison C Programming



Řetězec v jazyce C je pole znaků, které je ukončeno znakem null ( 0). Pomocí této vlastnosti se porovnají řetězce.







Dva řetězce lze různě porovnávat. V tomto tutoriálu nejprve uvidíme uživatelem definovanou funkci pro porovnání dvou řetězců a poté uvidíme některé vestavěné funkce knihovny, které lze velmi snadno použít ke srovnání dvou řetězců. Začněme tedy.



Porovnání řetězců pomocí funkce definované uživatelem:

Napíšeme funkci stringCompare () porovnávat řetězce. Procházíme řetězci a porovnáváme každý znak řetězce, dokud se nedostaneme na konec jednoho nebo obou nebo jednoho neshodného. Pokud je traverz dosažen na konec obou řetězců, pak se řetězce shodují; v opačném případě se řetězce neshodují.



01./*userDefinedFunction.c*/
02.
03.#zahrnout
04.
05.intstringCompare( charstr1[ ], charstr2[ ] )
06.{
07.int=0;
08.
09. zatímco(str1[] ==str2[] )
10.
patnáct.
16.-li(str1[] == ' 0' &&str2[] == ' 0' )
17.vrátit se 0;
18.jiný
19.vrátit se -1;
dvacet.
dvacet jedna.}
22.
2. 3.
24.inthlavní()
25.{
26.charstr1[30],str2[30];
27.
28. printf ('Zadejte první řetězec:');
29. scanf ('% [^ n]% * c ',str1);
30. printf ('Zadejte druhý řetězec:');
31. scanf ('% [^ n]% * c ',str2);
32.
33.-li(stringCompare(str1,str2) == 0)
3. 4. printf („Řetězce jsou stejné n');
35.jiný
36. printf („Řetězce nejsou stejné n');
37.
38.vrátit se 0; 39.}





Zde procházíme řetězce pomocí smyčky while a proměnné . Když jsou znaky stejné na stejné pozici obou řetězců, hodnota se zvýší o 1 (řádek 13). Pokud znaky nejsou stejné (řádek 09) nebo dosáhneme konce řetězce (řádek 11), pak je smyčka while přerušena. Po smyčce while zkontrolujeme, zda jsou průchody řetězců dosaženy až do konce (řádek 16). Pokud je průchod dosažen na konec obou řetězců, pak jsou řetězce stejné, jinak ne.

Porovnání řetězců pomocí vestavěných funkcí knihovny:

Pro porovnání řetězců lze použít následující funkce knihovny. Všechny funkce jsou deklarovány v souboru řetězec.h hlavičkový soubor.



funkce strcmp ():

Tato funkce porovnává dva řetězce předané funkci.

Syntax :

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

Návratová hodnota: Pokud jsou řetězce stejné, vraťte 0. Vrátí záporné celé číslo, pokud je hodnota ASCII prvního bezkonkurenčního znaku prvního řetězce menší než druhý řetězec. Pokud je hodnota ASCII prvního bezkonkurenčního znaku prvního řetězce větší než druhý řetězec, vrátí kladné celé číslo. Některé systémy vracejí rozdíl hodnoty ASCII prvního neodpovídajícího znaku a některé systémy vrací -1, pokud je hodnota ASCII prvního bezkonkurenčního znaku prvního řetězce menší než druhý řetězec a vrací 1, pokud je hodnota ASCII prvního bezkonkurenčního znaku první řetězec je větší než druhý řetězec.

Příklad Návratová hodnota Vysvětlení
strcmp ( Hello World, Hello World ) 0 Dva řetězce jsou stejné.
strcmp ( Dobrý den, ahoj 0 světe ) 0 Řetězce jsou porovnávány až do znaku „ 0“. První řetězec ve výchozím nastavení končí „ 0“ a druhý řetězec obsahuje znak „ 0“ za „Hello“.
strcmp ( Dobrý den 0 0 0 ″, Hello 0 World ) 0 Řetězce jsou porovnávány až do znaku „ 0“.
strcmp ( Ahoj světe, ahoj světe ) Záporné celé číslo Hodnota ASCII prvního bezkonkurenčního znaku prvního řetězce („H“) je menší než druhý řetězec („h“)
strcmp ( ahoj světe, ahoj světe ) Kladné celé číslo Hodnota ASCII prvního nepřekonatelného znaku prvního řetězce („h“) je větší než druhý řetězec („H“)

funkce strncmp ():

Tato funkce je podobná funkci strcmp () , ale zde musíme určit, kolik bytů se porovnává předáním dalšího argumentu funkci.

Syntax:

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

Návratová hodnota: Funkce se vrátí 0 pokud první n znaky obou řetězců jsou stejné; v opačném případě vrátí záporné nebo kladné celé číslo v závislosti na znaménku rozdílů mezi hodnotou ASCII prvního neodpovídajícího znaku.

Příklad Návratová hodnota Vysvětlení
strncmp ( Hello World, Hello World, 5 ) 0 Prvních 5 postav je stejných.
strncmp ( Dobrý den, ahoj 0 svět, 5 ) 0 Prvních 5 postav je stejných.
strncmp ( Dobrý den 0 0 0 ″, Hello 0 World, 8 ) 0 „ 0“ je za prvních 5 znaků v obou řetězcích. Porovnání se tedy zastaví po 5, nikoli 8.
strncmp ( Ahoj světe, ahoj světe, 5 ) Záporné celé číslo Hodnota ASCII prvního bezkonkurenčního znaku prvního řetězce („H“) je menší než druhý řetězec („h“)

funkce strcasecmp ():

Tato funkce je podobná funkci strcmp () , ale zde řetězce nerozlišují velká a malá písmena.

Syntax:

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

Návratová hodnota: Stejný jako strcmp () , ale řetězce jsou považovány za rozlišují velká a malá písmena .

Příklad Návratová hodnota Vysvětlení
strcasecmp ( Hello World, Hello World ) 0 Dva řetězce jsou stejné.
strcasecmp ( Dobrý den, ahoj 0 světe ) 0 Řetězce jsou porovnávány až do znaku „ 0“. První řetězec ve výchozím nastavení končí „ 0“ a druhý řetězec obsahuje znak „ 0“ za „Hello“.
strcasecmp ( Ahoj světe, ahoj světe ) 0 Řetězce jsou rozlišují velká a malá písmena. Hello World a Hello World jsou stejné.

strncasecmp () funkce:

Tato funkce je podobná funkci strncmp () , ale zde řetězce nerozlišují velká a malá písmena.

Syntax:

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

Návratová hodnota: Stejný jako strncmp () , když jsou řetězce považovány za citlivé na velikost písmen.

Příklad Návratová hodnota Vysvětlení
strncasecmp ( Hello World, Hello World, 5 ) 0 Prvních 5 postav je stejných.
strncasecmp ( Dobrý den, ahoj 0 svět, 5 ) 0 Prvních 5 postav je stejných.
strncasecmp ( Dobrý den 0 0 0 ″, Hello 0 World, 8 ) 0 „ 0“ je za prvních 5 znaků v obou řetězcích. Porovnání se tedy zastaví po 5, nikoli 8.
strncasecmp ( Ahoj světe, ahoj světe, 5 ) 0 Řetězce jsou rozlišují velká a malá písmena. Dobrý den a ahoj jsou stejné.

funkce memcmp ():

Tato funkce porovnává dva paměťové bloky bajt po bajtu. Musíme porovnat dva ukazatele paměťových bloků a počet bajtů.

Syntax:

int memcmp (konst prázdné *str1, konst prázdné *str2, velikost_tn)

Návratová hodnota: Funkce vrátí 0, pokud dva bloky paměti ( n bajty) jsou stejné; jinak vrátí rozdíly mezi první neodpovídající dvojicí bajtů (bajty jsou interpretovány jako nepodepsané objekty char, poté povýšeny na int).

Příklad Návratová hodnota Vysvětlení
memcmp ( Hello World, Hello World, 5 ) 0 Prvních 5 postav je stejných.
memcmp ( Dobrý den 0 0 0 ″, Hello 0 World, 8 ) Záporné celé číslo Prvních 6 znaků je stejných, ale 7. znak je jiný. Zde se srovnání nezastavilo jako strncmp () při získávání znaku „ 0“.
memcmp ( Ahoj světe, ahoj světe, 11 ) Záporné celé číslo Hodnota ASCII prvního bezkonkurenčního znaku prvního řetězce („H“) je menší než druhý řetězec („h“)

Příklad:

Následuje příklad kódu C všech diskutovaných funkcí.

01./*stringCompare.c*/
02.
03.#zahrnout
04.#zahrnout
05.
06.inthlavní()
07.{
08. printf ('strcmp ('Ahoj světe','Ahoj světe') => %d n', strcmp ( 'Ahoj světe','Ahoj světe' ));
09. printf ('strcmp ('Ahoj','Ahoj\0Svět') => %d n', strcmp ( 'Ahoj','Ahoj 0Svět' ));
10. printf ('strcmp ('Ahoj světe','Ahoj světe') => %d n', strcmp ( 'Ahoj světe','Ahoj světe' ) );
jedenáct. printf ('strcmp ('Ahoj\0\0\0','Ahoj\0Svět') => %d n', strcmp ( 'Ahoj 0 0 0','Ahoj 0Svět' ));
12.
13. printf (' n--------------- n');
14.
patnáct. printf ('strncmp ('Ahoj světe','Ahoj světe', 5) => %d n', strncmp ( 'Ahoj světe','Ahoj světe',5 ));
16. printf ('strncmp ('Ahoj','Ahoj\0Svět', 5) => %d n', strncmp ( 'Ahoj','Ahoj 0Svět',5 ));
17. printf ('strncmp ('Ahoj\0\0\0','Ahoj\0Svět', 8) => %d n', strncmp ( 'Ahoj 0 0 0','Ahoj 0Svět',8 ));
18. printf ('strncmp ('Ahoj světe','Ahoj světe', 5) => %d n', strncmp ( 'Ahoj světe','Ahoj světe',5 ));
19.
dvacet. printf (' n--------------- n');
dvacet jedna.
22. printf ('strcasecmp ('Ahoj světe','Ahoj světe') => %d n',strcasecmp( 'Ahoj světe','Ahoj světe' ));
2. 3. printf ('strcasecmp ('Ahoj','Ahoj\0Svět') => %d n',strcasecmp( 'Ahoj','Ahoj 0Svět' ));
24. printf ('strcasecmp ('Ahoj světe','Ahoj světe') => %d n',strcasecmp( 'Ahoj světe','Ahoj světe' ));
25.
26. printf (' n--------------- n');
27.
28. printf ('strncasecmp ('Ahoj světe','Ahoj světe', 5) => %d n',strncasecmp( 'Ahoj světe','Ahoj světe',5 ) );
29. printf ('strncasecmp ('Ahoj','Ahoj\0Svět', 5) => %d n',strncasecmp( 'Ahoj','Ahoj 0Svět',5 ));
30. printf ('strncasecmp ('Ahoj\0\0\0','Ahoj\0Svět', 8) => %d n',strncasecmp( 'Ahoj 0 0 0','Ahoj 0Svět',8 ));
31. printf ('strncasecmp ('Ahoj světe','Ahoj světe', 5) => %d n',strncasecmp( 'Ahoj světe','Ahoj světe',5 ));
32.
33. printf (' n--------------- n');
3. 4.
35. printf ('memcmp ('Ahoj světe','Ahoj světe', 5) => %d n', memcmp ( 'Ahoj světe','Ahoj světe',5 ) );
36. printf ('memcmp ('Ahoj\0\0\0','Ahoj\0Svět', 8) => %d n', memcmp ( 'Ahoj 0 0 0','Ahoj 0Svět',8 ));
37. printf ('memcmp ('Ahoj světe','Ahoj světe', 11) => %d n', memcmp ( 'Ahoj světe','Ahoj světe',jedenáct ));
38.
39.vrátit se 0; 40.}

Závěr:

V tomto tutoriálu jsme tedy viděli, jak lze řetězce porovnávat různými způsoby. Jak jsme viděli, funkce stringCompare () vrací -1 pro nestejné řetězce, ale to lze upravit tak, že vrací hodnotu ASCII neshodného znaku. Můžete jej použít ve svém kódu, který je pro vás nejvhodnější.