strnlen、strnlen_s、wcsnlen、wcsnlen_s、_mbsnlen、_mbsnlen_l、_mbstrnlen、_mbstrnlen_l
現在のロケールまたは渡されたロケールを使用して、文字列の長さを取得します。 これらは、strlen、wcslen、_mbslen、_mbslen_l、_mbstrlen、_mbstrlen_l のセキュリティが強化されたバージョンです。
重要
_mbsnlen、_mbsnlen_l、_mbstrnlen、および _mbstrnlen_l は、Windows ランタイムで実行するアプリケーションでは使用できません。詳細については、「/ZW でサポートされない CRT 関数」を参照してください。
size_t strnlen( const char *str, size_t numberOfElements ); size_t strnlen_s( const char *str, size_t numberOfElements ); size_t wcsnlen( const wchar_t *str, size_t numberOfElements ); size_t wcsnlen_s( const wchar_t *str, size_t numberOfElements ); size_t _mbsnlen( const unsigned char *str, size_t numberOfElements ); size_t _mbsnlen_l( const unsigned char *str, size_t numberOfElements, _locale_t locale ); size_t _mbstrnlen( const char *str, size_t numberOfElements ); size_t _mbstrnlen_l( const char *str, size_t numberOfElements, _locale_t locale );
パラメーター
str
NULL で終わる文字列。numberOfElements
文字列バッファーのサイズ。locale
使用するロケール。
戻り値
これらの関数は、文字列内の文字数を返します (終端の null 文字は含まれません)。 文字列 (または wcsnlen の場合はワイド文字) の最初の numberOfElements バイト内に null 終端文字がない場合は、エラー状況を示す numberOfElements が返されます。null で終わる文字列の長さは、厳密に numberOfElements 未満になります。
_mbstrnlen および _mbstrnlen_l は、文字列に無効なマルチバイト文字が含まれている場合は -1 を返します。
解説
注意
strnlen は strlen に代わるものではありません。strnlen は、既知のサイズのバッファー (ネットワーク パケットなど) 内の受信した信頼できないデータのサイズを計算するためにのみ使用することを目的としています。strnlen は長さを計算しますが、文字列に終端文字がない場合にバッファーの末尾を超えません。その他の状況では、strlen を使用します。(同じことが wcsnlen、_mbsnlen、および _mbstrnlen に適用されます)。
これらの各関数は、str 内の文字数を返します (終端の null 文字は含まれません)。 ただし、strnlen および strnlen_s は文字列を 1 バイト文字列として扱うため、マルチバイト文字が含まれている場合でも、戻り値は常にバイト数と同じです。 wcsnlen および wcsnlen_s は、それぞれ strnlen および strnlen_s のワイド文字バージョンです。wcsnlen および wcsnlen_s の引数はワイド文字列で、文字数はワイド文字単位です。 それ以外では、wcsnlen と strnlen の動作は同じです。strnlen_s と wcsnlen_s の場合も同様です。
strnlen、wcsnlen,、および _mbsnlen は、パラメーターを検証しません。 str が NULL の場合、アクセス違反が発生します。
strnlen_s および wcsnlen_s は、パラメーターを検証します。 str が NULL の場合、関数は 0 を返します。
_mbstrnlen もそのパラメーターを検証します。 str が NULL の場合、または numberOfElements が INT_MAX を超える場合、「パラメーターの検証」で説明されているように、_mbstrnlen は無効なパラメーター例外を生成します。 実行の継続が許可された場合、_mbstrnlen は errno を EINVAL に設定し、-1 を返します。
汎用テキスト ルーチンのマップ
TCHAR.H のルーチン |
_UNICODE および _MBCS が未定義の場合 |
_MBCS が定義されている場合 |
_UNICODE が定義されている場合 |
---|---|---|---|
_tcsnlen |
strnlen |
strnlen |
wcsnlen |
_tcscnlen |
strnlen |
_mbsnlen |
wcsnlen |
_tcscnlen_l |
strnlen |
_mbsnlen_l |
wcsnlen |
_mbsnlen と _mbstrnlen は、マルチバイト文字列のマルチバイト文字数を返します。 _mbsnlen は、現在使用中のマルチバイトのコード ページに従って、または渡されたロケールに従って、マルチバイト文字のシーケンスを認識します。マルチバイト文字の有効性はテストしません。 _mbstrnlen は、マルチバイト文字の有効性をテストし、マルチバイト文字のシーケンスを認識します。 _mbstrnlen に渡された文字列に無効なマルチバイト文字が含まれている場合、errno は EILSEQ に設定されます。
出力値は、ロケールの LC_CTYPE カテゴリの設定で決まります。詳細については、「setlocale、_wsetlocale」を参照してください。 _l サフィックスが付いていないバージョンがこのロケールに依存する動作に現在のロケールを使用し、_l サフィックスが付いているバージョンが渡されたロケール パラメーターを代わりに使用する点を除いて、これらの関数のバージョンは同じです。 詳細については、「ロケール」を参照してください。
必要条件
ルーチン |
必須ヘッダー |
---|---|
strnlen, strnlen_s |
<string.h> |
wcsnlen, wcsnlen_s |
<string.h> または <wchar.h> |
_mbsnlen, _mbsnlen_l |
<mbstring.h> |
_mbstrnlen, _mbstrnlen_l |
<stdlib.h> |
互換性の詳細については、「互換性」を参照してください。
使用例
// crt_strnlen.c
#include <string.h>
int main()
{
// str1 is 82 characters long. str2 is 159 characters long
char* str1 = "The length of a string is the number of characters\n"
"excluding the terminating null.";
char* str2 = "strnlen takes a maximum size. If the string is longer\n"
"than the maximum size specified, the maximum size is\n"
"returned rather than the actual size of the string.";
size_t len;
size_t maxsize = 100;
len = strnlen(str1, maxsize);
printf("%s\n Length: %d \n\n", str1, len);
len = strnlen(str2, maxsize);
printf("%s\n Length: %d \n", str2, len);
}
同等の .NET Framework 関数
参照
関連項目
strncat、_strncat_l、wcsncat、_wcsncat_l、_mbsncat、_mbsncat_l
strncmp、wcsncmp、_mbsncmp、_mbsncmp_l
strncpy_s、_strncpy_s_l、wcsncpy_s、_wcsncpy_s_l、_mbsncpy_s、_mbsncpy_s_l
strrchr、wcsrchr、_mbsrchr、_mbsrchr_l