strcmp в C/C++: разбираемся с примерами

👋 Привет! В этой статье мы поговорим о функции strcmp, которая позволяет сравнить две строки между собой. В начале мы рассмотрим несколько примеров использования этой функции, затем реализуем её сами, а в конце вы найдете упражнения для закрепления материала.

Иллюстрация strcmp

Как сравнить строки с помощью strcmp

Для сравнения двух строк в C/C++, можно воспользоваться функцией strcmp. Эта функция доступна после подключения файла <string.h>. В C++ вы можете подключить <cstring>.

strcmp принимает две строки и сравнивает по очереди каждый символ между собой. Как только она находит первый символ, который различается, она вернет:

  • 1 если символ в первой строке больше символа во второй.
  • -1 если этот первый различающийся символ меньше в первой строке.
  • 0 если строки равны между собой (нет различающихся символов).

Если различающийся символ найти не удалось, но одна из строк закончилась раньше другой, то она будет считаться меньшей из двух. Мы посмотрим как это работает на примере.

Прототип этой функции выглядит следующим образом:

int strcmp ( const char * a, const char * b );
  • Первым аргументом нужно передать указатель на строку в стиле Си (строки в стиле Си заканчиваются символом '\0').
  • Вторым аргументом нужно передать указатель на строку, с которой нужно произвести сравнение.
  • Функция возвращает 1, -1 или 0 в зависимости от того, какая строка оказалась “больше”.

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

#include <stdio.h>
#include <string.h>

void compare(const char* a, const char* b) {
  printf("strcmp(\"%s\", \"%s\") = %d\n", a, b, strcmp(a, b));
}

int main() {
  compare("abc", "abc");
  compare("abc", "ab");
  compare("ab", "abc");
  compare("abc", "bcd");
  compare("bc", "abc");

  return 0;
}

Вывод программы:

strcmp("abc", "abc") = 0
strcmp("abc", "ab") = 1
strcmp("ab", "abc") = -1
strcmp("abc", "bcd") = -1
strcmp("bc", "abc") = 1

Что будет результатом выполнения кода?

#include <stdio.h>
#include <string.h>

int main() {
  char str1[] = "apple";
  char str2[] = "application";
  printf("%d", strcmp(str1, str2));
  return 0;
}
-1
1
0
Ошибка

Как реализовать strcmp самому

Давайте реализуем свою версию функции strcmp без использования встроенных библиотек, чтобы лучше понять, как она работает:

#include <stdio.h>
#include <string.h>

int my_strcmp(const char* a, const char* b) {
  int result = 0;
  // ищем первый различающийся символ до тех пор, пока не дойдем до конца одной из строк
  // мы можем не проверять *b != '\0`, поскольку первым условием для продолжения цикла
  // является равенство *a и *b. Если *a равно *b и *a не равно '\0', значит *b тоже не равен '\0'
  while (*a == *b && *a != '\0') {
    a++;
    b++;
  }

  // если обе строки закончились, то они равны
  if (*a == '\0' && *b == '\0') {
    return 0;
  }

  // тут мы сравниваем первый различающийся символ
  if (*a > *b) {
    return 1;
  } else {
    return -1;
  }
}

void compare(const char* a, const char* b) {
  printf("my_strcmp(\"%s\", \"%s\") = %d\n", a, b, my_strcmp(a, b));
}

int main() {
  compare("abc", "abc");
  compare("abc", "ab");
  compare("ab", "abc");
  compare("abc", "bcd");
  compare("bc", "abc");

  return 0;
}

Вывод программы:

my_strcmp("abc", "abc") = 0
my_strcmp("abc", "ab") = 1
my_strcmp("ab", "abc") = -1
my_strcmp("abc", "bcd") = -1
my_strcmp("bc", "abc") = 1

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

Упражнения

  1. Сравнение строк с использованием strcmp:
    Напишите программу на C, которая запрашивает у пользователя две строки и сравнивает их с помощью функции strcmp. Программа должна выводить на экран результат сравнения в удобочитаемом формате. Протестируйте вашу программу на различных парах строк.

  2. Реализация своей версии strcmp:
    На основе примера из статьи, напишите свою версию функции strcmp. Затем проверьте ее работоспособность, сравнив результаты с встроенной функцией strcmp на различных примерах.

  3. Расширение функциональности:
    Добавьте в вашу программу возможность не только сравнивать строки, но и определять длину каждой строки перед сравнением. Выводите длину каждой строки перед результатом сравнения.

Обсуждение