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

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

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

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

#include <cwchar> /* или #include <cstring> */
int wcscmp(const wchar_t *str1, const wchar_t *str2);

Пример:

_wsetlocale(LC_ALL, L"Russian_Russia.1251");
wchar_t str1[] = L"абв", str2[] = L"абв", str3[] = L"АБВ";
std::wcout << std::wcscmp(str1, str2) << std::endl; // 0
std::wcout << std::wcscmp(str1, str3) << std::endl; // 1
str1[2] = L'б'; // str1[] = L"абб", str2[] = L"абв";
std::wcout << std::wcscmp(str1, str2) << std::endl; // -1
str1[2] = L'г'; // str1[] = L"абг", str2[] = L"абв";
std::wcout << std::wcscmp(str1, str2) << std::endl; // 1
  • wcsncmp() — сравнивает count первых символов в L-строках str1 и str2. Если нулевой символ встретится раньше, то значение параметра count игнорируется. Функция возвращает одно из значений:
  • отрицательное число — если str1 меньше str2;
  • 0 — если строки равны;
  • положительное число — если str1 больше str2.

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

#include <cwchar> /* или #include <cstring> */
int wcsncmp(const wchar_t *str1, const wchar_t *str2,
            size_t count);

Пример:

_wsetlocale(LC_ALL, L"Russian_Russia.1251");
wchar_t str1[] = L"абв", str2[] = L"абг";
std::wcout << std::wcsncmp(str1, str2, 2) << std::endl; // 0
std::wcout << std::wcsncmp(str1, str2, 3) << std::endl; // -1
  • wcscoll() — функция аналогична функции wcscmp(), но сравнение производится с учетом значения LC_COLLATE в текущей локали. Например, буква «Ё» в диапазон между буквами «Е» и «Ж» не попадает, так как буква «Ё» имеет код 1025, буква «Е» — 1045, а буква «Ж» — 1046. Если сравнение производится с помощью функции wcscmp(), то буква «Е» будет больше буквы «Ё» (1045 > 1025). При использовании функции wcscoll() с настройкой локали буква «Ё» попадет в диапазон между буквами «Е» и «Ж», так как используются локальные настройки по алфавиту. Если локаль не настроена, то эта функция эквивалентна функции wcscmp(). Сравнение производится с учетом регистра символов. Прототип функции:
#include <cwchar> /* или #include <cstring> */
int wcscoll(const wchar_t *str1, const wchar_t *str2);

Пример:

wchar_t str1[] = L"Е", str2[] = L"Ё";
std::wcout << (int)str1[0] << std::endl;             // 1045 (Е)
std::wcout << (int)str2[0] << std::endl;             // 1025 (Ё)
std::wcout << std::wcscmp(str1, str2) << std::endl;  // 1
std::wcout << std::wcscoll(str1, str2) << std::endl; // 1
// Без настройки локали: Е (код 1045) больше Ё (код 1025)
// Настройка локали
_wsetlocale(LC_ALL, L"Russian_Russia.1251");
std::wcout << std::wcscmp(str1, str2) << std::endl;  // 1
std::wcout << std::wcscoll(str1, str2) << std::endl; // -1
// После настройки локали: Е меньше Ё
  • _wcsncoll() — сравнивает maxCount первых символов в L-строках str1 и str2. Сравнение производится с учетом регистра символов. Функция аналогична функции wcsncmp(), но сравнение производится с учетом значения LC_COLLATE в текущей локали. Прототип функции:
#include <cwchar> /* или #include <cstring> */
int _wcsncoll(const wchar_t *str1, const wchar_t *str2,
              size_t maxCount);

Пример:

_wsetlocale(LC_ALL, L"Russian_Russia.1251");
wchar_t str1[] = L"абв", str2[] = L"абг";
std::wcout << _wcsncoll(str1, str2, 2) << std::endl; // 0
std::wcout << _wcsncoll(str1, str2, 3) << std::endl; // -1
  • wcsxfrm() — преобразует L-строку source в строку специального формата и записывает ее в dest. В конец вставляется нулевой символ. Записывается не более maxCount символов. Если количество символов maxCount меньше необходимого количества символов после преобразования, то содержимое dest не определено. В качестве значения функция возвращает число необходимых символов. Чтобы просто получить количество необходимых символов (без учета нулевого символа), то в параметре maxCount указывается число 0, а в параметре dest передается нулевой указатель. Прототип функции:
#include <cwchar> /* или #include <cstring> */
size_t wcsxfrm(wchar_t *dest, const wchar_t *source,
               size_t maxCount);

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

_wsetlocale(LC_ALL, L"Russian_Russia.1251");
wchar_t str1[] = L"Е", str2[] = L"Ё";
wchar_t buf1[10] = {0}, buf2[10] = {0};
size_t x = std::wcsxfrm(nullptr, str1, 0);
std::wcout << x << std::endl; //  7 (нужен буфер 7 + 1)
std::wcsxfrm(buf1, str1, 10);
std::wcsxfrm(buf2, str2, 10);
std::wcout << std::wcscmp(str1, str2) << std::endl;
// 1 ("Е" > "Ё")
std::wcout << std::wcscoll(str1, str2) << std::endl;
// -1 ("Е" < "Ё")
std::wcout << std::wcscmp(buf1, buf2) << std::endl;
// -1 ("Е" < "Ё")
  • _wcsicmp() — сравнивает L-строки без учета регистра символов. Функция учитывает настройки локали для категории LC_CTYPE. Для русских букв необходимо настроить локаль. Прототип функции:
#include <cwchar> /* или #include <cstring> */
int _wcsicmp(const wchar_t *str1, const wchar_t *str2);

Пример:

_wsetlocale(LC_ALL, L"Russian_Russia.1251");
wchar_t str1[] = L"абв", str2[] = L"АБВ";
std::wcout << _wcsicmp(str1, str2) << std::endl; // 0
  • _wcsnicmp() — сравнивает maxCount первых символов в L-строках str1 и str2 без учета регистра символов. Функция учитывает настройки локали для категории LC_CTYPE. Для русских букв необходимо настроить локаль. Прототип функции:
#include <cwchar> /* или #include <cstring> */
int _wcsnicmp(const wchar_t *str1, const wchar_t *str2,
              size_t maxCount);

Пример:

_wsetlocale(LC_ALL, L"Russian_Russia.1251");
wchar_t str1[] = L"абве", str2[] = L"АБВЖ";
std::wcout << _wcsnicmp(str1, str2, 3) << std::endl; // 0
std::wcout << _wcsnicmp(str1, str2, 4) << std::endl; // -1
  • _wcsicoll() — сравнивает L-строки без учета регистра символов. Функция учитывает настройки локали для категорий LC_CTYPE и LC_COLLATE. Для русских букв необходимо настроить локаль. Прототип функции:
#include <cwchar> /* или #include <cstring> */
int _wcsicoll(const wchar_t *str1, const wchar_t *str2);

Пример:

_wsetlocale(LC_ALL, L"Russian_Russia.1251");
wchar_t str1[] = L"абв", str2[] = L"АБВ";
std::wcout << _wcsicoll(str1, str2) << std::endl; // 0
  • _wcsnicoll() — сравнивает maxCount первых символов в L-строках str1 и str2 без учета регистра символов. Функция учитывает настройки локали для категорий LC_CTYPE и LC_COLLATE. Для русских букв необходимо настроить локаль. Прототип функции:
#include <cwchar> /* или #include <cstring> */
int _wcsnicoll(const wchar_t *str1, const wchar_t *str2,
               size_t maxCount);

Пример:

_wsetlocale(LC_ALL, L"Russian_Russia.1251");
wchar_t str1[] = L"абве", str2[] = L"АБВЖ";
std::wcout << _wcsnicoll(str1, str2, 3) << std::endl; // 0
std::wcout << _wcsnicoll(str1, str2, 4) << std::endl; // -1

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

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

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

#include <cwchar> /* или #include <wchar.h> */
int wmemcmp(const wchar_t *str1, const wchar_t *str2, size_t count);

Пример:

_wsetlocale(LC_ALL, L"Russian_Russia.1251");
wchar_t str1[] = L"abc", str2[] = L"abc";
std::wcout << std::wmemcmp(str1, str2, 3) << std::endl; // 0
str1[2] = L'b';
std::wcout << std::wmemcmp(str1, str2, 3) << std::endl; // -1
str1[2] = L'd';
std::wcout << std::wmemcmp(str1, str2, 3) << std::endl; // 1

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

Помощь сайту

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

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