_stricmp, _wcsicmp, _mbsicmp, _stricmp_l, _wcsicmp_l, _mbsicmp_l
Выполняет сравнение строк без учета регистра.
Важно!
Функции _mbsicmp и _mbsicmp_l не могут использоваться в приложениях, запускаемых в среде выполнения Windows.Дополнительные сведения см. в разделе Функции CRT, которые не поддерживаются с ключом /ZW.
int _stricmp(
const char *string1,
const char *string2
);
int _wcsicmp(
const wchar_t *string1,
const wchar_t *string2
);
int _mbsicmp(
const unsigned char *string1,
const unsigned char *string2
);
int _stricmp_l(
const char *string1,
const char *string2,
_locale_t locale
);
int _wcsicmp_l(
const wchar_t *string1,
const wchar_t *string2,
_locale_t locale
);
int _mbsicmp_l(
const unsigned char *string1,
const unsigned char *string2,
_locale_t locale
);
Параметры
string1, string2
Строки с завершающим нулем для сравнения.locale
Используемый языковой стандарт.
Возвращаемое значение
Возвращаемое значение отражает взаимосвязь string1 со string2, как показано ниже.
Возвращаемое значение |
Описание |
---|---|
< 0 |
string1 меньше string2 |
0 |
string1 идентична string2 |
> 0 |
string1 больше string2 |
При ошибке _mbsicmp возвращает _NLSCMPERROR, которая определена в <string.h> и <mbstring.h>.
Заметки
Функция _stricmp выполняет порядковое сравнение версий string1 и string2 в нижнем регистре и возвращает значение, показывающее их взаимосвязь. _stricmp отличается от _stricoll тем, что на сравнение _stricmp влияет только тип LC_CTYPE, определяющий регистр символов. Функция _stricoll сравнивает строки в соответствии с категориями LC_CTYPE и LC_COLLATE языкового стандарта, который включает как регистр, так и порядок сортировки. Подробнее о категории LC_COLLATE см. в разделах setlocale и Категории языкового стандарта. Версии этих функций без суффикса _l используют текущий языковой стандарт во время операций, зависящих от языкового стандарта. Версии с суффиксом идентичны за исключением того, что вместо этого они используют переданный языковой стандарт. Если языковой стандарт не задан, используется языковой стандарт C. Для получения дополнительной информации см. Языковой стандарт.
Примечание
_stricmp равно _strcmpi.Они взаимозаменяемы, но предпочтительнее стандарт _stricmp.
Функция _strcmpi эквивалентна _stricmp и предоставляется только для обеспечения обратной совместимости.
Так как _stricmp производит сравнение в нижнем регистре, это может стать причиной непредвиденного поведения.
Для иллюстрации того, что преобразование _stricmp влияет на результат сравнения, возьмем две строки: JOHNSTON и JOHN_HENRY. Строка JOHN_HENRY будет считаться меньше JOHNSTON, так как "_" имеет меньшее значение ASCII, чем S в нижнем регистре. В действительности любой символ, имеющий значение ASCII в диапазоне от 91 до 96, считается меньше любой буквы.
Если функция strcmp используется вместо _stricmp, то JOHN_HENRY будет больше JOHNSTON.
Функции _wcsicmp и _mbsicmp являются версиями функции _stricmp для расширенных и многобайтовых символов. Аргументы и возвращаемое значение _wcsicmp представляют собой двухбайтовые строки; аргументы и возвращаемое значение _mbsicmp представляют собой многобайтовые строки. _mbsicmp распознает последовательности многобайтовых символов в соответствии с текущей многобайтовой кодовой страницей и возвращает _NLSCMPERROR при ошибке. Для получения дополнительной информации см. Кодовые страницы. В остальном эти три функции ведут себя идентично.
_wcsicmp и wcscmp ведут себя идентично за исключением того, что wcscmp не выполняет преобразование аргументов в нижний регистр перед их сравнением. _mbsicmp и _mbscmp ведут себя идентично за исключением того, что _mbscmp не выполняет преобразование аргументов в нижний регистр перед их сравнением.
Необходимо вызвать setlocale для того, чтобы функция _wcsicmp могла работать с символами Latin 1. По умолчанию действует языковой стандарт C, таким образом, например, ä не будет считаться равным Ä. Вызовите setlocale с любым языковым стандартом, отличным от C, перед вызовом _wcsicmp. Следующий пример демонстрирует, насколько функция _wcsicmp чувствительна к языковому стандарту:
// crt_stricmp_locale.c
#include <string.h>
#include <stdio.h>
#include <locale.h>
int main() {
setlocale(LC_ALL,"C"); // in effect by default
printf("\n%d",_wcsicmp(L"ä", L"Ä")); // compare fails
setlocale(LC_ALL,"");
printf("\n%d",_wcsicmp(L"ä", L"Ä")); // compare succeeds
}
Альтернативой является вызов _create_locale, _wcreate_locale и передача возвращаемого объекта языкового стандарта в качестве параметра в _wcsicmp_l.
Все эти функции проверяют свои параметры. Если string1 или string2 является указателем NULL, то вызывается обработчик недопустимого параметра, как описано в разделе Проверка параметров. Если продолжение выполнения разрешено, эти функции возвращают _NLSCMPERROR и устанавливают для errno значение EINVAL.
Универсальное текстовое сопоставление функций
Подпрограмма TCHAR.H |
_UNICODE и _MBCS не определены |
_MBCS определено |
_UNICODE определено |
---|---|---|---|
_tcsicmp |
_stricmp |
_mbsicmp |
_wcsicmp |
Требования
Подпрограмма |
Обязательный заголовок |
---|---|
_stricmp, _stricmp_l |
<string.h> |
_wcsicmp, _wcsicmp_l |
<string.h> или <wchar.h> |
_mbsicmp, _mbsicmp_l |
<mbstring.h> |
Дополнительные сведения о совместимости см. в разделе Совместимость.
Пример
// crt_stricmp.c
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
char string1[] = "The quick brown dog jumps over the lazy fox";
char string2[] = "The QUICK brown dog jumps over the lazy fox";
int main( void )
{
char tmp[20];
int result;
// Case sensitive
printf( "Compare strings:\n %s\n %s\n\n", string1, string2 );
result = strcmp( string1, string2 );
if( result > 0 )
strcpy_s( tmp, _countof(tmp), "greater than" );
else if( result < 0 )
strcpy_s( tmp, _countof(tmp), "less than" );
else
strcpy_s( tmp, _countof(tmp), "equal to" );
printf( " strcmp: String 1 is %s string 2\n", tmp );
// Case insensitive (could use equivalent _stricmp)
result = _stricmp( string1, string2 );
if( result > 0 )
strcpy_s( tmp, _countof(tmp), "greater than" );
else if( result < 0 )
strcpy_s( tmp, _countof(tmp), "less than" );
else
strcpy_s( tmp, _countof(tmp), "equal to" );
printf( " _stricmp: String 1 is %s string 2\n", tmp );
}
Эквивалент в .NET Framework
См. также
Ссылки
strncmp, wcsncmp, _mbsncmp, _mbsncmp_l
_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l
strrchr, wcsrchr, _mbsrchr, _mbsrchr_l