_stricmp、_wcsicmp、_mbsicmp、_stricmp_l、_wcsicmp_l、_mbsicmp_l

执行不区分大小写的字符串比较。

重要

_mbsicmp 和 _mbsicmp_l 无法用于在 Windows 运行时中执行的应用程序。有关详细信息,请参阅 /ZW 不支持 CRT 函数

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
    要比较的 null 终止的字符串。

  • 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 之间的 ASCII 值的任何字符都将被视为小于任何字母。

如果使用 strcmp 函数而不是 _stricmp,则“JOHN_HENRY”将大于“JOHNSTON”。

_wcsicmp 和 _mbsicmp 分别是 _stricmp 的宽字符和多字节字符版本。 _wcsicmp 的参数和返回值是宽字符字符串;而 _mbsicmp 的则是多字节字符字符串。 _mbsicmp 根据当前的多字节代码页识别多字节字符序列,并在发生错误时返回 _NLSCMPERROR。 有关更多信息,请参阅代码页。 否则这三个函数否则具有相同行为。

_wcsicmp 和 wcscmp 行为方式相同,只不过 wcscmp 不会在进行比较前将其参数转换为小写。 _mbsicmp 和 _mbscmp 行为方式相同,只不过 _mbscmp 不会在进行比较前将其参数转换为小写。

为了让 _wcsicmp 使用 Latin 1 字符,你将需要调用 setlocale。 默认情况下,C 区域设置有效,因此,例如,ä 比较时不会等于 Ä。 在调用 _wcsicmp 前,使用 C 区域设置以外的任何区域设置调用 setlocale。 下面的示例演示了 _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 等效项

System::String::Compare

请参见

参考

字符串操作 (CRT)

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