Share via


strcmp, wcscmp, _mbscmp

 

The new home for Visual Studio documentation is Visual Studio 2017 Documentation on docs.microsoft.com.

The latest version of this topic can be found at strcmp, wcscmp, _mbscmp.

Compare strings.

Important

_mbscmp cannot be used in applications that execute in the Windows Runtime. For more information, see CRT functions not supported with /ZW.

Syntax

int strcmp(  
   const char *string1,  
   const char *string2   
);  
int wcscmp(  
   const wchar_t *string1,  
   const wchar_t *string2   
);  
int _mbscmp(  
   const unsigned char *string1,  
   const unsigned char *string2   
);  

Parameters

string1, string2
Null-terminated strings to compare.

Return Value

The return value for each of these functions indicates the ordinal relation of string1 to string2.

Value Relationship of string1 to string2
< 0 string1 is less than string2
0 string1 is identical to string2
> 0 string1 is greater than string2

On a parameter validation error, _mbscmp returns _NLSCMPERROR, which is defined in <string.h> and <mbstring.h>.

Remarks

The strcmp function performs an ordinal comparison of string1 and string2 and returns a value that indicates their relationship. wcscmp and _mbscmp are, respectively, wide-character and multibyte-character versions of strcmp. _mbscmp recognizes multibyte-character sequences according to the current multibyte code page and returns _NLSCMPERROR on an error. For more information, see Code Pages. Also, if string1 or string2 is a null pointer, _mbscmp invokes the invalid parameter handler, as described in Parameter Validation. If execution is allowed to continue, _mbscmp returns _NLSCMPERROR and sets errno to EINVAL. strcmp and wcscmp do not validate their parameters. These three functions behave identically otherwise.

Generic-Text Routine Mappings

TCHAR.H routine _UNICODE & _MBCS not defined _MBCS defined _UNICODE defined
_tcscmp strcmp _mbscmp wcscmp

The strcmp functions differ from the strcoll functions in that strcmp comparisons are ordinal, and are not affected by locale. strcoll compares strings lexicographically by using the LC_COLLATE category of the current locale. For more information about the LC_COLLATE category, see setlocale, _wsetlocale.

In the "C" locale, the order of characters in the character set (ASCII character set) is the same as the lexicographic character order. However, in other locales, the order of characters in the character set may differ from the lexicographic order. For example, in certain European locales, the character 'a' (value 0x61) comes before the character 'ä' (value 0xE4) in the character set, but the character 'ä' comes in front of the character 'a' lexicographically.

In locales for which the character set and the lexicographic character order differ, you can use strcoll instead of strcmp for lexicographic comparison of strings. Alternatively, you can use strxfrm on the original strings, and then use strcmp on the resulting strings.

The strcmp functions are case-sensitive. _stricmp, _wcsicmp, and _mbsicmp compare strings by first converting them to their lowercase forms. Two strings that contain characters that are located between 'Z' and 'a' in the ASCII table ('[', '\', ']', '^', '_', and '```') compare differently, depending on their case. For example, the two strings "ABCDE" and "ABCD^" compare one way if the comparison is lowercase ("abcde" > "abcd^") and the other way ("ABCDE" < "ABCD^") if the comparison is uppercase.

Requirements

Routine Required header
strcmp <string.h>
wcscmp <string.h> or <wchar.h>
_mbscmp <mbstring.h>

For additional compatibility information, see Compatibility.

Libraries

All versions of the C run-time libraries.

Example

// crt_strcmp.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  

.NET Framework Equivalent

System::String::CompareOrdinal

See Also

String Manipulation
memcmp, wmemcmp
_memicmp, _memicmp_l
strcoll Functions
_stricmp, _wcsicmp, _mbsicmp, _stricmp_l, _wcsicmp_l, _mbsicmp_l
strncmp, wcsncmp, _mbsncmp, _mbsncmp_l
_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l
strrchr, wcsrchr, _mbsrchr, _mbsrchr_l
strspn, wcsspn, _mbsspn, _mbsspn_l
strxfrm, wcsxfrm, _strxfrm_l, _wcsxfrm_l