Сравнение строк: программирование на C

String Comparison C Programming



Строка в языке C - это массив символов, который заканчивается нулевым символом ( 0). С помощью этого свойства сравниваются строки.







Две строки можно сравнивать по-разному. В этом руководстве сначала мы увидим определяемую пользователем функцию для сравнения двух строк, а затем мы увидим некоторые встроенные библиотечные функции, которые можно использовать для очень простого сравнения двух строк. Итак, приступим.



Сравнение строк с использованием пользовательской функции:

Напишем функцию строкаCompare () для сравнения строк. Мы проходим по строкам и сравниваем каждый символ строки до тех пор, пока не дойдем до конца любого из них, либо обоих, либо не будет найдено одно несовпадение. Если обход достигается до конца обеих строк, то строки сопоставляются; в противном случае строки не совпадают.



01./*userDefinedFunction.c*/
02.
03.#включают
04.
05.intстрокаCompare( символstr1[ ], символул2[ ] )
06.{
07.intязнак равно0;
08.
09. в то время как(str1[я] ==ул2[я] )
10.
пятнадцать.
16.если(str1[я] == ' 0' &&ул2[я] == ' 0' )
17.возвращение 0;
18.еще
19.возвращение -1;
двадцать.
21.}
22.
2. 3.
24.intглавный()
25.{
26 год.символstr1[30],ул2[30];
27.
28 год. printf ('Введите первую строку:');
29. сканф ('% [^ п]% * c ',str1);
30. printf ('Введите вторую строку:');
31 год. сканф ('% [^ п]% * c ',ул2);
32.
33.если(строкаCompare(str1,ул2) == 0)
3. 4. printf ('Струны равны п');
35 год.еще
36. printf ('Струны не равны п');
37.
38.возвращение 0; 39.}





Здесь мы проходим строки, используя цикл while и переменную я . Когда символы равны в одной и той же позиции обеих строк, значение я увеличивается на 1 (строка 13). Если символы не равны (строка 09) или мы достигли конца строки (строка 11), тогда цикл while является разрывом. После цикла while мы проверяем, достигнуты ли обходы строки до конца или нет (строка 16). Если обход достигнут до конца обеих строк, то строки равны, в противном случае - нет.

Сравнение строк с использованием встроенных библиотечных функций:

Для сравнения строк можно использовать следующие библиотечные функции. Все функции объявлены в string.h заголовочный файл.



Функция strcmp ():

Эта функция сравнивает две строки, переданные в функцию.

Синтаксис :

int strcmp (const символ *str1, const символ *ул2)

Возвращаемое значение: Верните 0, если строки равны. Вернуть отрицательное целое число, если значение ASCII первого несовпадающего символа первой строки меньше, чем вторая строка. Вернуть положительное целое число, если значение ASCII первого несовпадающего символа первой строки больше, чем вторая строка. Некоторые системы возвращают разницу значений ASCII первого несовпадающего символа, а некоторые системы возвращают -1, если значение ASCII первого несовпадающего символа первой строки меньше, чем вторая строка, и возвращают 1, если значение ASCII первого несовпадающего символа первая строка больше второй.

Пример Возвращаемое значение Объяснение
strcmp ( Привет мир, привет мир ) 0 Две струны одинаковые.
strcmp ( Привет, Привет 0 Мир ) 0 Строки сравниваются до символа « 0». Первая строка по умолчанию заканчивается на « 0», а вторая строка содержит символ « 0» после «Hello».
strcmp ( Привет 0 0 0 ″, Привет 0 Мир ) 0 Строки сравниваются до символа « 0».
strcmp ( Привет, мир, привет, мир ) Отрицательное целое число Значение ASCII первого несовпадающего символа первой строки («H») меньше, чем вторая строка («h»).
strcmp ( привет мир, привет мир ) Положительное число Значение ASCII первого несовпадающего символа первой строки («h») больше, чем вторая строка («H»).

Функция strncmp ():

Эта функция аналогична функции strcmp () , но здесь мы должны указать, сколько байтов сравнивается, передав функции дополнительный аргумент.

Синтаксис:

int strncmp (const символ *str1, const символ *ул2, size_tп)

Возвращаемое значение: Функция возвращает 0 если первый п символы двух строк равны; в противном случае возвращается отрицательное или положительное целое число в зависимости от знака различия между значением ASCII первого несовпадающего символа.

Пример Возвращаемое значение Объяснение
strncmp ( Привет, мир, привет, мир, 5 ) 0 Первые 5 символов совпадают.
strncmp ( Здравствуйте, Hello 0 World, 5 ) 0 Первые 5 символов совпадают.
strncmp ( Привет 0 0 0 ″, Привет 0 Мир, 8 ) 0 « 0» стоит после первых 5 символов в обеих строках. Таким образом, сравнение прекращается через 5, а не через 8.
strncmp ( Привет, мир, привет, мир, 5 ) Отрицательное целое число Значение ASCII первого несовпадающего символа первой строки («H») меньше, чем вторая строка («h»).

Функция strcasecmp ():

Эта функция аналогична функции strcmp () , но здесь строки не чувствительны к регистру.

Синтаксис:

intstrcasecmp(const символ *str1, const символ *ул2)

Возвращаемое значение: Такой же как strcmp () , но строки обрабатываются как без учета регистра .

Пример Возвращаемое значение Объяснение
strcasecmp ( Привет мир, привет мир ) 0 Две струны одинаковые.
strcasecmp ( Привет, Привет 0 Мир ) 0 Строки сравниваются до символа « 0». Первая строка по умолчанию заканчивается на « 0», а вторая строка содержит символ « 0» после «Hello».
strcasecmp ( Привет, мир, привет, мир ) 0 Струны без учета регистра. Итак, Hello World и hello World - это одно и то же.

Функция strncasecmp ():

Эта функция аналогична функции strncmp () , но здесь строки не чувствительны к регистру.

Синтаксис:

intstrncasecmp(const символ *str1, const символ *ул2)

Возвращаемое значение: Такой же как strncmp () , когда строки обрабатываются как чувствительные к регистру.

Пример Возвращаемое значение Объяснение
strncasecmp ( Привет, мир, привет, мир, 5 ) 0 Первые 5 символов совпадают.
strncasecmp ( Здравствуйте, Hello 0 World, 5 ) 0 Первые 5 символов совпадают.
strncasecmp ( Привет 0 0 0 ″, Привет 0 Мир, 8 ) 0 « 0» стоит после первых 5 символов в обеих строках. Таким образом, сравнение прекращается через 5, а не через 8.
strncasecmp ( Привет, мир, привет, мир, 5 ) 0 Струны без учета регистра. Итак, привет и привет - это одно и то же.

Функция memcmp ():

Эта функция сравнивает два блока памяти побайтно. Мы должны передать два указателя блоков памяти и количество байтов для сравнения.

Синтаксис:

int memcmp (const пустота *str1, const пустота *ул2, size_tп)

Возвращаемое значение: Функция возвращает 0, если два блока памяти ( п байты) равны; в противном случае он возвращает различия между первой несовпадающей парой байтов (байты интерпретируются как объекты типа unsigned 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 (' п--------------- п');
21.
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 несоответствующего символа. Вы можете использовать его в своем коде, который вам больше всего подходит.