C言語をやっていた頃はstrcmp(とstrncmp)だけ知っていれば文字列比較には十分だった。
しかしWindowsプログラミングになるとユニコードやらTCHAR型が登場したおかげで非常に複雑になっている。さらに同じ挙動を示す関数が名前違いで複数用意されているものだから混沌としている。
しかし関数の名前の法則(?)を押さえておけば何となく使うべき関数をチョイスできる。
・「w」がついている場合はユニコード文字列の比較
・「t」が付いている場合はTCHAR型文字列の比較
・「str」が付いている場合は通常の文字列(SHIFT-JISやANSI文字列)の比較
・「n」が付いている場合は文字数を指定しての比較
・「i」が付いている場合は大文字と小文字を区別しない比較
という命名慣習だ。
例えば「strcmp」は「str」が含まれるから通常文字列用で、「i」や「n」が含まれないから大文字と小文字を区別して文字数の指定ができない比較用となるし、「stricmp」は大文字小文字を同一視する比較用、「strncmp」は文字数を指定しての比較用となる。
実際のプログラミングでは...
通常の文字列に対応したstrcmp、strncmp(文字数指定)、stricmp(大文字小文字同一視)、_strnicmp(文字数指定かつ大文字小文字同一視)。
TCHAR型文字列に対応した_tcscmp、_tcsncmp(文字数指定)、_tcsicmp(大文字小文字同一視)、_tcsnicmp(文字数指定かつ大文字小文字同一視)。
の合計8個程度を覚えておけば問題ないだろう。
MSDNライブラリから適当にピックアップしただけで以下のものが見つかった。きちんと探せばまだまだある。いったいいくつあるのだろう?
| char | wchar_t | TCHAR | 比較長 | 大小同一 | ロケール | 対応OS | 補足 | ||||
| _tcscmp | ○ | ||||||||||
| _tccmp | ○ | ||||||||||
| strcmp | ○ | ||||||||||
| wcscmp | ○ | ||||||||||
| _mbscmp | MBCS | ||||||||||
| _tcsncmp | ○ | ○ | |||||||||
| _tcsnccmp | ○ | ○ | |||||||||
| strncmp | ○ | ○ | |||||||||
| wcsncmp | ○ | ○ | |||||||||
| _mbsnbcmp | MBCS | ○ | |||||||||
| _mbsncmp | MBCS | ○ | |||||||||
| _tcsncmp_l | MBCS | ○ | ○ | ||||||||
| _mbsnbcml | MBCS | ○ | ○ | ||||||||
| _mbsncmp_l | MBCS | ○ | ○ | ||||||||
| _tcsicmp | ○ | ○ | |||||||||
| _stricmp | ○ | ○ | |||||||||
| _wcsicmp | ○ | ○ | |||||||||
| _mbsicmp | MBCS | ○ | |||||||||
| _tcsncicmp | ○ | ○ | ○ | ||||||||
| _strnicmp | ○ | ○ | ○ | ||||||||
| _wcsnicmp | ○ | ○ | ○ | ||||||||
| _mbsnicmp | MBCS | ○ | ○ | ||||||||
| _tcsnicmp | ○ | ○ | ○ | ||||||||
| _strnicmp | ○ | ○ | ○ | ||||||||
| _wcsnicmp | ○ | ○ | ○ | ||||||||
| _mbsnbicmp | MBCS | ○ | ○ | ||||||||
| _tcsncicmp_l | ○ | ○ | ○ | ○ | |||||||
| _strnicmp_l | ○ | ○ | ○ | ○ | |||||||
| _wcsnicmp_l | ○ | ○ | ○ | ○ | |||||||
| _mbsnicmp_l | MBCS | ○ | ○ | ○ | |||||||
| StrCmp | ○ | ||||||||||
| StrCmpA | ○ | ||||||||||
| StrCmpW | ○ | ||||||||||
| StrCmpN | ○ | ○ | |||||||||
| StrCmpNA | ○ | ○ | |||||||||
| StrCmpNW | ○ | ○ | |||||||||
| StrCmpI | ○ | ○ | |||||||||
| StrCmpIA | ○ | ○ | |||||||||
| StrCmpIW | ○ | ○ | |||||||||
| StrCmpNI | ○ | ○ | ○ | ||||||||
| StrCmpNIA | ○ | ○ | ○ | ||||||||
| StrCmpNIW | ○ | ○ | ○ | ||||||||
| StrNCmp | ○ | ○ | |||||||||
| StrNCmpI | ○ | ○ | ○ | ||||||||
| StrCmpC | ○ | Windows 2000以降 | |||||||||
| StrCmpCA | ○ | Windows 2000以降 | |||||||||
| StrCmpCW | ○ | Windows 2000以降 | |||||||||
| StrCmpNC | ○ | ○ | Windows 2000以降 | ||||||||
| StrCmpNCA | ○ | ○ | Windows 2000以降 | ||||||||
| StrCmpNCW | ○ | ○ | Windows 2000以降 | ||||||||
| StrCmpIC | ○ | ○ | Windows 2000以降 | ||||||||
| StrCmpICA | ○ | ○ | Windows 2000以降 | ||||||||
| StrCmpICW | ○ | ○ | Windows 2000以降 | ||||||||
| StrCmpNIC | ○ | ○ | ○ | Windows 2000以降 | |||||||
| StrCmpNICA | ○ | ○ | ○ | Windows 2000以降 | |||||||
| StrCmpNICW | ○ | ○ | ○ | Windows 2000以降 | |||||||
| StrCmpLogicalW | ○ | Windows XP以降 | 含まれる数値を比較に考慮 | ||||||||
| strcmpi | ○ | ○ | (現在は利用しない) | ||||||||
| CompareString | ○ | 可能 | 可能 | 戻り値に注意!等しいときはCSTR_EQUAL(=2)を返す | |||||||
| CompareStringA | ○ | 可能 | 可能 | 戻り値に注意!等しいときはCSTR_EQUAL(=2)を返す | |||||||
| CompareStringW | ○ | 可能 | 可能 | 戻り値に注意!等しいときはCSTR_EQUAL(=2)を返す | |||||||
| CompareStringEx | ○ | 可能 | 可能 | Windows Vista以降 | 戻り値に注意!等しいときはCSTR_EQUAL(=2)を返す | ||||||
| CompareStringOrdinal | ○ | 可能 | 可能 | Windows Vista以降 | 戻り値に注意!等しいときはCSTR_EQUAL(=2)を返す | ||||||
| CompareStringWrapW | ○ | 可能 | 可能 | Windows 2000以降 | 戻り値に注意!等しいときはCSTR_EQUAL(=2)を返す | ||||||
| strcoll | ○ | ○ | |||||||||
| wcscoll | ○ | ○ | |||||||||
| _mbscoll | MBCS | ○ | |||||||||
| _tcsncoll | ○ | ○ | ○ | ||||||||
| _strncoll | ○ | ○ | ○ | ||||||||
| _wcsncoll | ○ | ○ | ○ | ||||||||
| _mbsnbcoll | MBCS | ○ | ○ | ||||||||
| _tcsncoll_l | ○ | ○ | ○ | ||||||||
| _strncoll | ○ | ○ | ○ | ||||||||
| _wcsncoll | ○ | ○ | ○ | ||||||||
| _mbsncoll | MBCS | ○ | ○ | ||||||||
| _strncoll_l | ○ | ○ | ○ | ||||||||
| _wcsncoll_l | ○ | ○ | ○ | ||||||||
| _mbsncoll_l | MBCS | ○ | ○ | ||||||||
| _mbsnbcoll_l | MBCS | ○ | ○ | ||||||||
| _tcsnicoll | ○ | ○ | ○ | ○ | |||||||
| _strnicoll | ○ | ○ | ○ | ○ | |||||||
| _wcsnicoll | ○ | ○ | ○ | ○ | |||||||
| _mbsnbicoll | MBCS | ○ | ○ | ○ | |||||||
| _tcsnicoll_l | ○ | ○ | ○ | ○ | |||||||
| _strnicoll_l | ○ | ○ | ○ | ○ | |||||||
| _wcsnicoll_l | ○ | ○ | ○ | ○ | |||||||
| _mbsnbicoll_l | MBCS | ○ | ○ | ○ | |||||||
| _tcsncicoll | ○ | ○ | ○ | ○ | |||||||
| _strnicoll | ○ | ○ | ○ | ○ | |||||||
| _wcsnicoll | ○ | ○ | ○ | ○ | |||||||
| _mbsnbicoll | MBCS | ○ | ○ | ○ | |||||||
| _tcsnicoll | ○ | ○ | ○ | ○ | |||||||
| _strnicoll | ○ | ○ | ○ | ○ | |||||||
| _wcsnicoll | ○ | ○ | ○ | ○ | |||||||
| _mbsnbicoll | MBCS | ○ | ○ | ○ | |||||||
| _tcsnicoll_l | ○ | ○ | ○ | ○ | |||||||
| _strnicoll_l | ○ | ○ | ○ | ○ | |||||||
| _wcsnicoll_l | ○ | ○ | ○ | ○ | |||||||
| _mbsnbicoll_l | MBCS | ○ | ○ | ○ | |||||||
