Namespaces
Variants

strlen, strnlen_s

From cppreference.net
< c ‎ | string ‎ | byte
定義先ヘッダ <string.h>
size_t strlen ( const char * str ) ;
(1)
size_t strnlen_s ( const char * str, size_t strsz ) ;
(2) (C11以降)
1) 与えられたヌル終端バイト文字列の長さを返します。つまり、 str が指す最初の要素から、最初のヌル文字を含まないまでの文字配列内の文字数です。
strがヌル終端バイト文字列へのポインタでない場合、動作は未定義です。
2) (1) と同様であるが、 str がnullポインタの場合に関数はゼロを返し、null文字が str の先頭 strsz バイト内で見つからなかった場合には strsz を返す点が異なる。
str がヌル終端バイト文字列へのポインタではなく、かつ strsz がその文字配列のサイズより大きい場合、動作は未定義です。
すべての境界チェック付き関数と同様に、 strnlen_s は実装によって __STDC_LIB_EXT1__ が定義されており、かつユーザーが <string.h> をインクルードする前に __STDC_WANT_LIB_EXT1__ を整数定数 1 に定義している場合にのみ利用可能であることが保証されます。

目次

パラメータ

str - 検査対象のヌル終端バイト文字列へのポインタ
strsz - 検査する最大文字数

戻り値

1) ヌル終端バイト文字列 str の長さ。
2) 成功時はヌル終端バイト文字列 str の長さ、 str がヌルポインタの場合はゼロ、 strsz はヌル文字が見つからなかった場合。

注記

strnlen_s wcsnlen_s は、 境界チェック付き関数 の中で唯一、ランタイム制約ハンドラーを呼び出さない関数です。これらは、ヌル終端されていない文字列に対する限定的なサポートを提供するために使用される純粋なユーティリティ関数です。

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <string.h>
int main(void)
{
    const char str[] = "How many characters does this string contain?";
    printf("without null character: %zu\n", strlen(str));
    printf("with null character:    %zu\n", sizeof str);
#ifdef __STDC_LIB_EXT1__
    printf("without null character: %zu\n", strnlen_s(str, sizeof str));
#endif
}

出力例:

without null character: 45
with null character:    46
without null character: 45

参考文献

  • C23規格 (ISO/IEC 9899:2024):
  • 7.24.6.3 strlen関数 (p: TBD)
  • K.3.7.4.4 strnlen_s関数 (p: TBD)
  • C17規格 (ISO/IEC 9899:2018):
  • 7.24.6.3 strlen関数 (p: TBD)
  • K.3.7.4.4 strnlen_s関数 (p: TBD)
  • C11規格 (ISO/IEC 9899:2011):
  • 7.24.6.3 strlen関数 (p: 372)
  • K.3.7.4.4 strnlen_s関数 (p: 623)
  • C99規格 (ISO/IEC 9899:1999):
  • 7.21.6.3 strlen関数 (p: 334)
  • C89/C90標準 (ISO/IEC 9899:1990):
  • 4.11.6.3 strlen関数

関連項目

(C95) (C11)
ワイド文字列の長さを返す
(関数)
次のマルチバイト文字のバイト数を返す
(関数)