Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Сравнение 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
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов