Еще одной задачей, предложенной для решения в прошлом занятии, было написание программы, которая посимвольно сравнивает между собой две строки. Для выполнения этой операции, тоже существует готовая функция –strcmp().
Данная функция принимает в качестве аргументов две строки, которые необходимо сравнить. В результате своей работы, если строки одинаковые, он возвращает нуль, и если разные, то либо целое число положительное или отрицательное. Сравнение идет по коду символов в таблице ASCII.
Рассмотрим пример.
Листинг 15.3
#include <stdio.h>
#include <string.h>
int main(void) {
char str1[] = "hello world",
str2[] = "hello world",
str3[] = "hello World";
int n12 = strcmp(str1,str2);
int n13 = strcmp(str1,str3);
int n31 = strcmp(str3,str1);
printf(" %s i %s %d\n", str1, str2,n12);
printf(" %s i %s %d\n", str1, str3,n13);
printf(" %s i %s %d\n", str3, str1,n31);
printf("%c/%d\n",str1[6],str1[6]);
printf("%c/%d\n",str3[6],str3[6]);
return(0);
}
Результат работы данной программы:
Рис.3. Сравнение строк функцией strcmp()
Строки str1 и str2 одинаковые и потому, при их сравнении получилось 0. А вот строки str1 и str3 различаются, регистром символа ‘w’ поэтому результат их сравнения не равен нулю. Обратите внимание, что в одном случае он равен единице, а в другом минус единице. Почему так получается, мы сейчас разберемся.
Строки сравниваются посимвольно, использую соответствие между символом и его кодом в таблице ASCII. Ниже сравнения, в нашей программе указаны коды символов ‘w’ и ‘W’. Как видите, код символа ‘w’ – 119, больше чем код символа ‘W’ – 87. Значит и строка str1больше чем строка str3.
Основное правило: Если, в функции strcmp() строка записанная в первом аргументе, больше чем строка во втором аргументе, то функция возвращает положительное число. Если меньше – отрицательное.
Есть и еще одна функция, предназначенная для сравнения строкstrncmp(). Её отличие лишь в том, что добавляется третий параметр – целое число, указывающее, сколько символов с начала строки необходимо сравнить.
Немного преобразуем предыдущую программу
Листинг 15.4
#include <stdio.h>
#include <string.h>
int main(void) {
char str1[] = "hello world",
str2[] = "hello World";
int n1 = strncmp(str1,str2,6);
int n2 = strncmp(str1,str2,7);
printf("%s i %s %d\n", str1, str2,n1);
printf("%s i %s %d\n", str1, str2,n2);
return(0);
}
Рис.4. Сравнение частей строк, с помощью функции strncmp().
Как видите, когда мы сравнили первые шесть символов двух строк, то получили 0, так как они совпадают. Если же мы сравниваем первые семь символов, то первая строка больше второй, и в ответе получается положительное целое число. Причем в данном случае, это разность между кодами соответствующих символов (119-87 = 32). Пользоваться этим обстоятельством нужно очень осторожно. Не факт, что в других средах разработки, эти функции реализованы точно таким же образом. Т.е. может быть, что где-то strcmp будет тоже возвращать 32, а не 1, как в нашем примере. А где-то возможноstrncmp не будет возвращать 32. Как это реализовано в вашей среде программирования проверьте самостоятельно.