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