Сравнение С-строк

Для сравнения С-строк предназначены следующие функции:

  • strcmp() — сравнивает C-строку str1 с C-строкой str2 без учета настроек локали и возвращает одно из значений:
  • отрицательное число — если str1 меньше str2;
  • 0 — если строки равны;
  • положительное число — если str1 больше str2.

Сравнение производится с учетом регистра символов. Прототип функции:

#include <cstring> /* или #include <string.h> */
int strcmp(const char *str1, const char *str2);

Пример:

char str1[] = "абв", str2[] = "абв", str3[] = "АБВ";
int result = std::strcmp(str1, str2);
std::cout << result << std::endl;           // 0
result = std::strcmp(str1, str3);
std::cout << result << std::endl;           // 1
str1[2] = 'б'; // str1[] = "абб", str2[] = "абв";
result = std::strcmp(str1, str2);
std::cout << result << std::endl;           // -1
str1[2] = 'г'; // str1[] = "абг", str2[] = "абв";
result = std::strcmp(str1, str2);
std::cout << result << std::endl;           // 1
  • strncmp() — сравнивает count первых символов в C-строках str1 и str2. Если нулевой байт встретится раньше, то значение параметра count игнорируется. Функция возвращает одно из значений:
  • отрицательное число — если str1 меньше str2;
  • 0 — если строки равны;
  • положительное число — если str1 больше str2.

Сравнение производится с учетом регистра символов. Прототип функции:

#include <cstring> /* или #include <string.h> */
int strncmp(const char *str1, const char *str2, size_t count);

Пример:

char str1[] = "абв", str2[] = "абг";
int result = std::strncmp(str1, str2, 2);
std::cout << result << std::endl;           // 0
result = std::strncmp(str1, str2, 3);
std::cout << result << std::endl;           // -1
  • strcoll() — функция аналогична функции strcmp(), но сравнение производится с учетом значения LC_COLLATE в текущей локали. Например, буква «ё» в диапазон между буквами «е» и «ж» не попадает, так как буква «ё» в кодировке windows-1251 имеет код –72, буква «е» — –27, а буква «ж» — –26. Если сравнение производится с помощью функции strcmp(), то буква «е» будет больше буквы «ё» (–27 > –72). При использовании функции strcoll() с настройкой локали Russian_Russia.1251 буква «ё» попадет в диапазон между буквами «е» и «ж», так как используются локальные настройки по алфавиту. Если локаль не настроена, то эта функция эквивалентна функции strcmp(). Сравнение производится с учетом регистра символов. Можно также воспользоваться функцией _strcoll_l(), которая позволяет задать локаль в третьем параметре. Прототипы функций:
#include <cstring> /* или #include <string.h> */
int strcoll(const char *str1, const char *str2);
int _strcoll_l(const char *str1, const char *str2,
               _locale_t locale);

Пример:

char str1[] = "е", str2[] = "ё";
std::cout << (int)str1[0] << std::endl;             // -27 (е)
std::cout << (int)str2[0] << std::endl;             // -72 (ё)
std::cout << std::strcmp(str1, str2) << std::endl;  // 1
std::cout << std::strcoll(str1, str2) << std::endl; // 1
// Без настройки локали: е (код -27) больше ё (код -72)
// Настройка локали
std::setlocale(LC_COLLATE, "Russian_Russia.1251");
std::cout << std::strcmp(str1, str2) << std::endl;  // 1
std::cout << std::strcoll(str1, str2) << std::endl; // -1
// После настройки локали: е меньше ё
  • _strncoll() и _strncoll_l() — сравнивают maxCount первых символов в C-строках str1 и str2. Сравнение производится с учетом регистра символов. Функции аналогичны функции strncmp(), но сравнение производится с учетом значения LC_COLLATE в текущей локали. Прототипы функций:
#include <cstring> /* или #include <string.h> */
int _strncoll(const char *str1, const char *str2,
              size_t maxCount);
int _strncoll_l(const char *str1, const char *str2,
                size_t maxCount, _locale_t locale);

Пример:

std::setlocale(LC_ALL, "Russian_Russia.1251");
char str1[] = "абв", str2[] = "абг";
std::cout << _strncoll(str1, str2, 2) << std::endl;  // 0
std::cout << _strncoll(str1, str2, 3) << std::endl;  // -1
  • strxfrm() — преобразует C-строку source в строку специального формата и записывает ее в dest. В конец вставляется нулевой символ. Записывается не более maxCount символов. Если количество символов maxCount меньше необходимого количества символов после преобразования, то содержимое dest не определено. В качестве значения функция возвращает число необходимых символов. Чтобы просто получить количество необходимых символов (без учета нулевого символа), то в параметре maxCount указывается число 0, а в параметре dest передается нулевой указатель. Можно также воспользоваться функцией _strxfrm_l(), которая дополнительно позволяет задать локаль в последнем параметре. Прототипы функций:
#include <cstring> /* или #include <string.h> */
size_t strxfrm(char *dest, const char *source, size_t maxCount);
size_t _strxfrm_l(char *dest, const char *source,
                  size_t maxCount, _locale_t locale);

Функция strcoll() прежде чем произвести сравнение неявно выполняет преобразование переданных строк в строки специального формата. Функция strxfrm() позволяет произвести такое преобразование явным образом. Преобразование строки производится с учетом значения LC_COLLATE в текущей локали. Если локаль не настроена, то просто выполняется копирование. В дальнейшем строки специального формата можно сравнивать с помощью функции strcmp(). Результат сравнения будет соответствовать результату сравнения с помощью функции strcoll(). Функцию strxfrm() следует использовать, если сравнение строк производится многократно. Пример:

std::setlocale(LC_ALL, "Russian_Russia.1251");
int result = 0;
char str1[] = "е", str2[] = "ё";
char buf1[10] = {0}, buf2[10] = {0};
result = (int)std::strxfrm(nullptr, str1, 0);
std::cout << result << std::endl; // 6 (нужен буфер 6 + 1)
std::strxfrm(buf1, str1, 10);
std::strxfrm(buf2, str2, 10);
result = std::strcmp(str1, str2);
std::cout << result << std::endl; //  1 ("е" больше "ё")
result = std::strcoll(str1, str2);
std::cout << result << std::endl; // -1 ("е" меньше "ё")
result = std::strcmp(buf1, buf2);
std::cout << result << std::endl; // -1 ("е" меньше "ё")
  • _stricmp() и _stricmp_l() — сравнивают C-строки без учета регистра символов. Функции учитывают настройки локали для категории LC_CTYPE. Для русских букв необходимо настроить локаль. Прототипы функций:
#include <cstring> /* или #include <string.h> */
int _stricmp(const char *str1, const char *str2);
int _stricmp_l(const char *str1, const char *str2,
               _locale_t locale);

Пример:

std::setlocale(LC_ALL, "Russian_Russia.1251");
char s1[] = "абв", s2[] = "АБВ";
std::cout << _stricmp(s1, s2) << std::endl; // 0
  • _strnicmp() и _strnicmp_l() — сравнивают maxCount первых символов в C-строках str1 и str2 без учета регистра символов. Функции учитывают настройки локали для категории LC_CTYPE. Для русских букв необходимо настроить локаль. Прототипы функций:
#include <cstring> /* или #include <string.h> */
int _strnicmp(const char *str1, const char *str2,
              size_t maxCount);
int _strnicmp_l(const char *str1, const char *str2,
                size_t maxCount, _locale_t locale);

Пример:

std::setlocale(LC_ALL, "Russian_Russia.1251");
char str1[] = "абве", str2[] = "АБВЖ";
std::cout << _strnicmp(str1, str2, 3) << std::endl; // 0
std::cout << _strnicmp(str1, str2, 4) << std::endl; // -1
  • _stricoll() и _stricoll_l() — сравнивают C-строки без учета регистра символов. Функции учитывают настройки локали для категорий LC_CTYPE и LC_COLLATE. Для русских букв необходимо настроить локаль. Прототипы функций:
#include <cstring> /* или #include <string.h> */
int _stricoll(const char *str1, const char *str2);
int _stricoll_l(const char *str1, const char *str2,
                _locale_t locale);

Пример:

char str1[] = "абв", str2[] = "АБВ";
std::cout << _stricoll(str1, str2) << std::endl;           // 32
_locale_t locale = _create_locale(LC_ALL, "Russian_Russia.1251");
std::cout << _stricoll_l(str1, str2, locale) << std::endl; // 0
_free_locale(locale);
std::setlocale(LC_ALL, "Russian_Russia.1251");
std::cout << _stricoll(str1, str2) << std::endl;           // 0
  • _strnicoll() и _strnicoll_l() — сравнивают maxCount первых символов в C-строках str1 и str2 без учета регистра символов. Функции учитывают настройки локали для категорий LC_CTYPE и LC_COLLATE. Для русских букв необходимо настроить локаль. Прототипы функций:
#include <cstring> /* или #include <string.h> */
int _strnicoll(const char *str1, const char *str2,
                size_t maxCount);
int _strnicoll_l(const char *str1, const char *str2,
                 size_t maxCount, _locale_t locale);

Пример:

std::setlocale(LC_ALL, "Russian_Russia.1251");
char str1[] = "абвг", str2[] = "АБВД";
std::cout << _strnicoll(str1, str2, 3) << std::endl; // 0
std::cout << _strnicoll(str1, str2, 4) << std::endl; // -1

Для сравнения строк можно также использовать функцию memcmp(). Функция memcmp() сравнивает первые size байтов массивов buf1 и buf2. В качестве значения функция возвращает:

  • отрицательное число — если buf1 меньше buf2;
  • 0 — если массивы равны;
  • положительное число — если buf1 больше buf2.

Прототип функции:

#include <cstring> /* или #include <string.h>
                      или #include <memory.h> */
int memcmp(const void *buf1, const void *buf2, size_t size);

Пример:

char str1[] = "abc", str2[] = "abc";
int result = std::memcmp(str1, str2, sizeof str2);
std::cout << result << std::endl;                // 0
str1[2] = 'b';
result = std::memcmp(str1, str2, sizeof str2);
std::cout << result << std::endl;                // -1
str1[2] = 'd';
result = std::memcmp(str1, str2, sizeof str2);
std::cout << result << std::endl;                // 1

Функция memcmp() производит сравнение с учетом регистра символов. Если необходимо произвести сравнение без учета символов, то можно воспользоваться функциями _memicmp() и _memicmp_l(). Для сравнения русских букв следует настроить локаль. Прототипы функций:

#include <cstring> /* или #include <string.h>
                      или #include <memory.h> */
int _memicmp(const void *buf1, const void *buf2, size_t size);
int _memicmp_l(const void *buf1, const void *buf2, size_t size,
               _locale_t locale);

Предназначение параметров и возвращаемое значение такое же, как у функции memcmp(). Функция _memicmp_l() позволяет дополнительно задать локаль. Пример использования функций:

std::setlocale(LC_ALL, "Russian_Russia.1251");
char str1[] = "абв", str2[] = "АБВ";
int result = _memicmp(str1, str2, sizeof str2);
std::cout << result << std::endl;                    // 0
result = std::memcmp(str1, str2, sizeof str2);
std::cout << result << std::endl;                    // 1
_locale_t locale = _create_locale(LC_ALL, "Russian_Russia.1251");
result = _memicmp_l(str1, str2, sizeof str2, locale);
std::cout << result << std::endl;                    // 0
_free_locale(locale);

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов