C Programování

Programování porovnávání řetězců C

Programování porovnávání řetězců C
Řetězec v jazyce C je pole znaků, které je ukončeno prázdným znakem (\ 0). Pomocí této vlastnosti jsou porovnávány řetězce.

Dva řetězce lze porovnat různými způsoby. V tomto kurzu nejprve uvidíme uživatelsky definovanou funkci pro porovnání dvou řetězců a poté uvidíme některé vestavěné funkce knihovny, které lze velmi snadno použít k porovnání dvou řetězců. Pojďme tedy začít.

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

Napíšeme funkci stringCompare () porovnat řetězce. Procházíme řetězce a porovnáváme každý znak řetězce, dokud nedosáhneme konce kteréhokoli z nich nebo obou. Pokud je traverza dosažena na konec obou řetězců, pak se řetězce shodují; jinak se řetězce neshodují.

01. / * userDefinedFunction.C*/
02.
03. #zahrnout
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. přestávka;
13. i ++;
14.
15.
16. if (str1 [i] == '\ 0' && str2 [i] == '\ 0')
17. návrat 0;
18. jiný
19. návrat -1;
20.
21.
22.
23.
24. int main ()
25.
26. char str1 [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. if (stringCompare (str1, str2) == 0)
34. printf ("Řetězce jsou stejné \ n");
35. jiný
36. printf ("Řetězce nejsou stejné \ n");
37.
38. návrat 0; 39.

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

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

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

funkce strcmp ():

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

Syntax:

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

Návratová hodnota: Vrátí 0, pokud jsou řetězce stejné. Vrátí záporné celé číslo, pokud je hodnota ASCII prvního nesrovnatelného znaku prvního řetězce menší než druhý řetězec. Vrátí kladné celé číslo, pokud je hodnota ASCII prvního nesrovnatelného znaku prvního řetězce větší než druhý řetězec. Některé systémy vracejí rozdíl hodnoty ASCII prvního neodpovídajícího znaku a některé systémy vracejí -1, pokud je hodnota ASCII prvního nepřizpůsobeného znaku prvního řetězce menší než druhý řetězec a vrací 1, pokud je hodnota ASCII prvního neodpovídající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 ( „Hello“, „Hello \ 0 World“ ) 0 Řetězce se porovnávají až do znaku „\ 0“. První řetězec ve výchozím nastavení končí na '\ 0' a druhý řetězec obsahuje znak '\ 0' za 'Hello'.
strcmp ( „Hello \ 0 \ 0 \ 0", „Hello \ 0 World" ) 0 Řetězce se porovnávají až do znaku „\ 0“.
strcmp ( „Hello World“, „ahoj svět“ ) Záporné celé číslo Hodnota ASCII prvního nesrovnatelného znaku prvního řetězce ('H') je menší než druhý řetězec ('h')
strcmp („Ahoj svět“, „ahoj svět“ ) Kladné celé číslo Hodnota ASCII prvního nesrovnatelné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ů je porovnáno předáním funkce další argument.

Syntax:

int strncmp (const char * str1, const char * str2, size_t n)

Návratová hodnota: Funkce se vrátí 0 pokud první n znaky dvou řetězců jsou stejné; v opačném případě vrací 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 znaků je stejných.
strncmp ( „Hello“, „Hello \ 0 World“, 5 ) 0 Prvních 5 znaků je stejných.
strncmp ( „Hello \ 0 \ 0 \ 0", „Hello \ 0 World", 8 ) 0 '\ 0' je po prvních 5 znacích v obou řetězcích. Porovnání se tedy zastaví po 5, ne 8.
strncmp ( „Hello World“, „ahoj svět“, 5 ) Záporné celé číslo Hodnota ASCII prvního nesrovnatelné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:

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

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

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

funkce strncasecmp ():

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

Syntax:

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

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

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

funkce memcmp ():

Tato funkce porovnává dva paměťové bloky po bajtech. Musíme předat dva ukazatele paměťových bloků a počet bajtů k porovnání.

Syntax:

int memcmp (const void * str1, const void * str2, size_t n)

Návratová hodnota: Funkce vrátí 0, pokud jsou dva paměťové bloky (n bajty) jsou stejné; v opačném případě vrátí rozdíly mezi první neodpovídající dvojicí bajtů (bajty jsou interpretovány jako nepodepsané char objekty, poté povýšené na int).

Příklad Návratová hodnota Vysvětlení
memcmp ( „Hello World“, „Hello World“, 5 ) 0 Prvních 5 znaků je stejných.
memcmp ( „Hello \ 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 ( „Hello World“, „ahoj svět“, 11 ) Záporné celé číslo Hodnota ASCII prvního nesrovnatelné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. / * stringPorovnat.C*/
02.
03. #zahrnout
04. #zahrnout
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" Svět "));
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 Svět ", 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 Svět ", 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 Svět ", 8));
37. printf ("memcmp (" Hello World "," hello World ", 11) =>% d \ n", memcmp ("Hello World", "hello World", 11));
38.
39. návrat 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 nerovné řetězce, ale toto může být upraveno tak, aby vracelo ASCII hodnotu neodpovídajícího znaku. Můžete jej použít ve svém kódu, který je pro vás nejvhodnější.

Hry OpenTTD vs Simutrans
OpenTTD vs Simutrans
Vytvoření vlastní simulace dopravy může být zábavné, uvolňující a mimořádně lákavé. Proto se musíte ujistit, že vyzkoušíte co nejvíce her, abyste našl...
Hry Výukový program OpenTTD
Výukový program OpenTTD
OpenTTD je jednou z nejpopulárnějších her pro obchodní simulaci. V této hře musíte vytvořit skvělé dopravní podnikání. Začnete však na začátku kolem r...
Hry SuperTuxKart pro Linux
SuperTuxKart pro Linux
SuperTuxKart je skvělý titul navržený tak, aby vám ve vašem systému Linux přinesl zážitek Mario Kart zdarma. Je to docela náročné a zábavné hrát, je n...