Две низове могат да се сравняват по различни начини. В този урок първо ще видим дефинирана от потребителя функция за сравняване на два низа, а след това ще видим някои вградени библиотечни функции, които могат да се използват за сравнение на два низа много лесно. И така, нека започнем.
Сравнение на низове с помощта на дефинирана от потребителя функция:
Ще напишем функция stringCompare () за сравнение на низове. Преминаваме през низовете и сравняваме всеки знак от низа, докато стигнем до края на който и да е или и двата, или един несъответстващ се намери. Ако обхождането е достигнато до края на двата струни, тогава струните са съвпадащи; в противен случай низовете са несъответстващи.
01. / * userDefinedFunction.° С*/02.
03. #include
04.
05. int stringCompare (char str1 [], char str2 [])
06.
07. int i = 0;
08.
09. докато (str1 [i] == str2 [i])
10.
11. ако (str1 [i] == '\ 0' || str2 [i] == '\ 0')
12. почивка;
13. i ++;
14.
15.
16. ако (str1 [i] == '\ 0' && str2 [i] == '\ 0')
17. връщане 0;
18. друго
19. връщане -1;
20.
21.
22.
23.
24. int main ()
25.
26. char str1 [30], str2 [30];
27.
28. printf ("Въведете първия низ:");
29. scanf ("% [^ \ n]% * c", str1);
30. printf ("Въведете втория низ:");
31. scanf ("% [^ \ n]% * c", str2);
32.
33. if (stringCompare (str1, str2) == 0)
34. printf ("Низовете са равни \ n");
35. друго
36. printf ("Низовете не са равни \ n");
37.
38. връщане 0; 39.
Тук обхождаме низовете, използвайки цикъл while и променлива i. Когато знаците са равни в една и съща позиция на двата низа, стойността на i се увеличава с 1 (ред 13). Ако символите не са равни (ред 09) или стигнем до края на низа (ред 11), тогава цикълът while е прекъсване. След цикъла while проверяваме дали и двата хода на низовете са достигнати до края или не (ред 16). Ако обхождането е достигнато до края на двата низа, тогава струните са равни, иначе не.
Сравнение на низове с помощта на вградени библиотечни функции:
Следните библиотечни функции могат да се използват за сравнение на низове. Всички функции са декларирани в низ.з заглавен файл.
функция strcmp ():
Тази функция сравнява два низа, предадени на функцията.
Синтаксис:
int strcmp (const char * str1, const char * str2)Върната стойност: Връща 0, ако низовете са равни. Връща отрицателно цяло число, ако ASCII стойността на първия несравним символ на първия низ е по-малка от втория низ. Връща положително цяло число, ако стойността на ASCII на първия несравним символ на първия низ е по-голяма от втория низ. Някои системи връщат разлика в ASCII стойността на първия несъответстващ символ, а някои системи връщат -1, ако ASCII стойността на първия несъвпадащ символ на първия низ е по-малка от втория низ и връща 1, ако ASCII стойността на първия несъответстващ символ първият низ е по-голям от втория низ.
Пример | Върната стойност | Обяснение |
strcmp ( „Здравей, свят“, „Здравей, свят“ ) | 0 | Две струни са еднакви. |
strcmp ( „Здравей“, „Здравей \ 0 Свят“ ) | 0 | Низовете се сравняват до символа '\ 0'. Първият низ по подразбиране завършва с „\ 0“, а вторият низ съдържа символа „\ 0“ след „Здравейте“. |
strcmp ( „Здравей \ 0 \ 0 \ 0", „Здравей \ 0 Свят" ) | 0 | Низовете се сравняват до символа '\ 0'. |
strcmp ( „Здравей, свят“, „здравей, свят“ ) | Отрицателно цяло число | Стойността на ASCII на първия несравним символ на първия низ ('H') е по-малка от втория низ ('h') |
strcmp („Здравей свят“, „здравей свят“ ) | Положително цяло число | Стойността на ASCII на първия несравним символ на първия низ ('h') е по-голяма от втория низ ('H') |
функция strncmp ():
Тази функция е подобна на функцията strcmp (), но тук трябва да посочим колко байта се сравняват чрез предаване на допълнителен аргумент на функцията.
Синтаксис:
int strncmp (const char * str1, const char * str2, size_t n)Върната стойност: Функцията се връща 0 ако първият н символите на двата низа са равни; в противен случай връща отрицателно или положително цяло число в зависимост от знака на разликите между стойността на ASCII на първия несъответстващ символ.
Пример | Върната стойност | Обяснение |
strncmp ( “Hello World”, “Hello World”, 5 ) | 0 | Първите 5 знака са еднакви. |
strncmp ( „Здравей“, „Здравей \ 0 Свят“, 5 ) | 0 | Първите 5 знака са еднакви. |
strncmp ( „Здравей \ 0 \ 0 \ 0", „Здравей \ 0 Свят", 8 ) | 0 | '\ 0' е след първите 5 знака в двата низа. И така, сравнението се спира след 5, а не 8. |
strncmp ( „Здравей, свят“, „здравей, свят“, 5 ) | Отрицателно цяло число | Стойността на ASCII на първия несравним символ на първия низ ('H') е по-малка от втория низ ('h') |
Функция strcasecmp ():
Тази функция е подобна на функцията strcmp (), но тук низовете не са чувствителни към малки и големи букви.
Синтаксис:
int strcasecmp (const char * str1, const char * str2)Върната стойност: Същото като strcmp (), но низовете се третират като регистър на буквите.
Пример | Върната стойност | Обяснение |
strcasecmp ( „Здравей, свят“, „Здравей, свят“ ) | 0 | Две струни са еднакви. |
strcasecmp ( „Здравей“, „Здравей \ 0 Свят“ ) | 0 | Низовете се сравняват до символа '\ 0'. Първият низ по подразбиране завършва с „\ 0“, а вторият низ съдържа символа „\ 0“ след „Здравейте“. |
strcasecmp ( „Здравей, свят“, „здравей, свят“ ) | 0 | Струните са регистър на буквите. И така, „Hello World“ и „hello World“ са едно и също. |
Функция strncasecmp ():
Тази функция е подобна на функцията strncmp (), но тук низовете не са чувствителни към малки и големи букви.
Синтаксис:
int strncasecmp (const char * str1, const char * str2)Върната стойност: Същото като strncmp (), когато низовете се третират като чувствителни към малки и големи букви.
Пример | Върната стойност | Обяснение |
strncasecmp ( “Hello World”, “Hello World”, 5 ) | 0 | Първите 5 знака са еднакви. |
strncasecmp ( „Здравей“, „Здравей \ 0 Свят“, 5 ) | 0 | Първите 5 знака са еднакви. |
strncasecmp ( „Здравей \ 0 \ 0 \ 0", „Здравей \ 0 Свят", 8 ) | 0 | '\ 0' е след първите 5 знака в двата низа. И така, сравнението се спира след 5, а не 8. |
strncasecmp ( „Здравей, свят“, „здравей, свят“, 5 ) | 0 | Струните са регистър на буквите. И така, „Здравей“ и „здравей“ са едно и също. |
функция memcmp ():
Тази функция сравнява два байта по байт блокове памет. Трябва да предадем два указателя на блоковете памет и броя на байтовете за сравнение.
Синтаксис:
int memcmp (const void * str1, const void * str2, size_t n)Върната стойност: Функцията връща 0, ако двата блока памет (н байта) са равни; в противен случай връща разликите между първата несъответстваща двойка байтове (байтовете се интерпретират като неподписани обекти char, след което се повишават до int).
Пример | Върната стойност | Обяснение |
memcmp ( “Hello World”, “Hello World”, 5 ) | 0 | Първите 5 знака са еднакви. |
memcmp ( „Здравей \ 0 \ 0 \ 0", „Здравей \ 0 Свят", 8 ) | Отрицателно цяло число | Първите 6 знака са еднакви, но 7-ият знак е различен. Тук сравнението не спря като strncmp () при получаване на символ \ \ 0. |
memcmp ( „Здравей, свят“, „здравей, свят“, 11 ) | Отрицателно цяло число | Стойността на ASCII на първия несравним символ на първия низ ('H') е по-малка от втория низ ('h') |
Пример:
Следва пример за кода на С на всички обсъждани функции.
01. / * stringCompare.° С*/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 (" Здравей \\ 0 \\ 0 \\ 0 "," Здравей \\ 0 Свят ") =>% d \ n", strcmp ("Здравей \ 0 \ 0 \ 0", "Здравей \ 0 Свят "));
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 (" Здравей \\ 0 \\ 0 \\ 0 "," Здравей \\ 0 Свят ", 8) =>% d \ n", strncmp ("Здравей \ 0 \ 0 \ 0", "Здравей \ 0 Свят ", 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 (" Здравей \\ 0 \\ 0 \\ 0 "," Здравей \\ 0 Свят ", 8) =>% d \ n", strncasecmp ("Здравей \ 0 \ 0 \ 0", "Здравей \ 0 Свят ", 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 (" Здравей \\ 0 \\ 0 \\ 0 "," Здравей \\ 0 Свят ", 8) =>% d \ n", memcmp ("Здравей \ 0 \ 0 \ 0", "Здравей \ 0 Свят ", 8));
37. printf ("memcmp (" Hello World "," hello World ", 11) =>% d \ n", memcmp ("Hello World", "hello World", 11));
38.
39. връщане 0; 40.
Заключение:
И така, в този урок видяхме как низовете могат да се сравняват по различни начини. Както видяхме, функцията stringCompare () връща -1 за неравни низове, но това може да бъде модифицирано така, че да връща ASCII стойност на несъответстващ символ. Можете да го използвате във вашия код, който е най-подходящ за вас.