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