strlen、strlen_l、wcslen、wcslen_l、_mbslen、_mbslen_l、_mbstrlen、_mbstrlen_l
更新 : 2007 年 11 月
現在のロケールまたは指定されたロケールを使用し、文字列の長さを取得します。これらの関数にはセキュリティを強化したバージョンがあります。「strnlen、strnlen_s、strnlen_l、wcsnlen、wcsnlen_s、wcsnlen_l、_mbsnlen、_mbsnlen_l、_mbstrnlen、_mbstrnlen_l」を参照してください。
size_t strlen(
const char *str
);
size_t strlen_l(
const char *str,
_locale_t locale
);
size_t wcslen(
const wchar_t *str
);
size_t wcslen_l(
const wchar_t *str,
_locale_t locale
);
size_t _mbslen(
const unsigned char *str
);
size_t _mbslen_l(
const unsigned char *str,
_locale_t locale
);
size_t _mbstrlen(
const char *str
);
size_t _mbstrlen_l(
const char *str,
_locale_t locale
);
パラメータ
str
NULL で終わる文字列。locale
使用するロケール。
戻り値
これらの関数は、str の文字数を返します。終端の NULL は含まれません。文字列に無効なマルチバイト文字が含まれる場合に -1 を返す _mbstrlen を除いて、エラーを示す戻り値は予約されていません。
解説
strlen は文字列を 1 バイト文字列として扱うため、マルチバイト文字が含まれている場合でも、戻り値は常にバイト数と同じです。ワイド文字を使用する場合、strlen ではなく wcslen を使用します。wcslen の引数はワイド文字列で、文字数はワイド (2 バイト) 文字の単位です。それ以外の場合、wcslen と strlen の動作は同じです。
セキュリティに関するメモ これらの関数は、バッファ オーバーランが原因で発生する可能性のある問題の影響を受けます。バッファ オーバーランは、システムを攻撃するときによく使用される方法であり、その結果、認められていない権限が昇格されます。詳細については、「Avoiding Buffer Overruns」を参照してください。
汎用テキスト ルーチンのマップ
TCHAR.H のルーチン |
_UNICODE および _MBCS が未定義の場合 |
_MBCS が定義されている場合 |
_UNICODE が定義されている場合 |
---|---|---|---|
_tcslen |
strlen |
strlen |
wcslen |
_tcsclen |
strlen |
_mbslen |
wcslen |
_tcsclen_l |
strlen_l |
_mbslen_l |
wcslen_l |
_mbslen、_mbslen_l、_mbstrlen、および _mbstrlen_l は、マルチバイト文字列のマルチバイト文字数を返しますが、マルチバイト文字の有効性はテストしません。_mbstrlen と _mbstrlen_l は、マルチバイト文字の有効性をテストし、マルチバイト文字のシーケンス setlocale、_wsetlocale を認識します。_mbstrlen または _mbstrlen_l に渡された文字列に、該当するコード ページにおいて無効なマルチバイト文字が含まれる場合、これらの関数は -1 を返し、errno を EILSEQ に設定します。
出力値は、ロケールの LC_CTYPE カテゴリの設定で決まります。詳細については、「setlocale」を参照してください。これらの関数のうち _l サフィックスが付いていないバージョンでは、現在のロケールを使用してロケール依存の動作を行います。_l サフィックスが付いているバージョンは、渡されたロケール パラメータを代わりに使用する点を除いて同じです。詳細については、「ロケール」を参照してください。
必要条件
ルーチン |
必須ヘッダー |
---|---|
strlen |
<string.h> |
strlen_l |
<string.h> |
wcslen, wcslen_l |
<string.h> または <wchar.h> |
_mbslen, _mbslen_l |
<mbstring.h> |
_mbstrlen, _mbstrlen_l |
<stdlib.h> |
互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。
使用例
// crt_strlen.c
// Determine the length of a string. For the multi-byte character
// example to work correctly, the Japanese language support for
// non-Unicode programs must be enabled by the operating system.
#include <string.h>
#include <locale.h>
int main()
{
char* str1 = "Count.";
wchar_t* wstr1 = L"Count.";
char * mbstr1;
char * locale_string;
// strlen gives the length of single-byte character string
printf("Length of '%s' : %d\n", str1, strlen(str1) );
// wstrlen gives the length of a wide character string
wprintf(L"Length of '%s' : %d\n", wstr1, wcslen(wstr1) );
// A multibyte string: [A] [B] [C] [katakana A] [D] [\0]
// in Code Page 932. For this example to work correctly,
// the Japanese language support must be enabled by the
// operating system.
mbstr1 = "ABC" "\x83\x40" "D";
locale_string = setlocale(LC_CTYPE, "Japanese_Japan");
if (locale_string == NULL)
{
printf("Japanese locale not enabled. Exiting.\n");
exit(1);
}
else
{
printf("Locale set to %s\n", locale_string);
}
// _mbslen will recognize the Japanese multibyte character if the
// current locale used by the operating system is Japanese
printf("Length of '%s' : %d\n", mbstr1, _mbslen(mbstr1) );
// _mbstrlen will recognize the Japanese multibyte character
// since the CRT locale is set to Japanese even if the OS locale
// isnot.
printf("Length of '%s' : %d\n", mbstr1, _mbstrlen(mbstr1) );
printf("Bytes in '%s' : %d\n", mbstr1, strlen(mbstr1) );
}
Length of 'Count.' : 6
Length of 'Count.' : 6
Length of 'ABCァD' : 5
Length of 'ABCァD' : 5
Bytes in 'ABCァD' : 6
.NET Framework の相当するアイテム
参照
参照
strrchr、wcsrchr、_mbsrchr、_mbsrchr_l