Поделиться через


_stricmp, _wcsicmp, _mbsicmp, _stricmp_l, _wcsicmp_l, _mbsicmp_l

Выполняет сравнение строк без учета регистра.

Важно!

Функции _mbsicmp и _mbsicmp_l не могут использоваться в приложениях, запускаемых в среде выполнения Windows. Дополнительные сведения: Функции CRT, которые не поддерживаются в приложениях универсальной платформы Windows.

Синтаксис

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, как показано ниже.

Возвращаемое значение Description
< 0 string1 меньше string2
0 string1 идентично string2
> 0 string1 больше string2

При ошибке возвращается _NLSCMPERRORзначение _mbsicmp , которое определяется в <string.h> и <mbstring.h>.

Замечания

_stricmp Функция сравнивает string1 и string2 после преобразования каждого символа в строчный регистр и возвращает значение, указывающее их связь. _stricmp отличается от _stricoll тем, что на сравнение _stricmp влияет только тип LC_CTYPE, определяющий регистр символов. Функция _stricoll сравнивает строки в соответствии с категориями LC_CTYPE и LC_COLLATE языкового стандарта, который включает как регистр, так и порядок сортировки. Дополнительные сведения о LC_COLLATE категории см. в категориях setlocale и категориях языкового стандарта. Версии этих функций без суффикса _l используют текущий языковой стандарт во время операций, зависящих от языкового стандарта. Версии с суффиксом идентичны за исключением того, что вместо этого они используют переданный языковой стандарт. Если языковой стандарт не задан, используется языковой стандарт C. Дополнительные сведения см. в разделе Locale.

Примечание.

_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 к работе с латинскими 1 символами. Языковой стандарт C действует по умолчанию, поэтому, например, ä не будет сравниваться с Ä. Вызовите setlocale с любым языковым стандартом, отличным от C, перед вызовом _wcsicmp. Следующий пример демонстрирует, насколько функция _wcsicmp чувствительна к языковому стандарту:

// crt_stricmp_locale.c
By default, this function's global state is scoped to the application. To change this behavior, see [Global state in the CRT](../global-state.md).

#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

Все эти функции проверяют свои параметры. Если указатель string1string2 имеет значение 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 );
}
Compare strings:
   The quick brown dog jumps over the lazy fox
   The QUICK brown dog jumps over the lazy fox

   strcmp:   String 1 is greater than string 2
   _stricmp:  String 1 is equal to string 2

См. также

Обработка строк
memcmp, wmemcmp
_memicmp, _memicmp_l
strcmp, wcscmp, _mbscmp
Функции strcoll
strncmp, wcsncmp, _mbsncmp, _mbsncmp_l
_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l
strrchr, wcsrchr, _mbsrchr, _mbsrchr_l
_strset, _strset_l, _wcsset, _wcsset_l, _mbsset, _mbsset_l
strspn, wcsspn, _mbsspn, _mbsspn_l