Namespaces
Variants

memchr

From cppreference.net
< c ‎ | string ‎ | byte
ヘッダーで定義 <string.h>
void * memchr ( const void * ptr, int ch, size_t count ) ;
(1)
/*QVoid*/ * memchr ( /*QVoid*/ * ptr, int ch, size_t count ) ;
(2) (C23以降)
1) オブジェクト ptr が指す先頭 count バイト(各バイトは unsigned char として解釈)内で、 ( unsigned char ) ch の最初の出現を検索します。
2) 型ジェネリック関数で、 (1) と同等の機能を持つ。 T を修飾なしのオブジェクト型( void を含む)とする。
  • ptr の型が const T * の場合、戻り値の型は const void * となる。
  • それ以外の場合、 ptr の型が T * の場合、戻り値の型は void * となる。
  • それ以外の場合、動作は未定義となる。
これらのジェネリック関数のマクロ定義が抑制され、実際の関数にアクセスする場合(例えば、 ( memchr ) や関数ポインタが使用される場合)、実際の関数宣言 (1) が可視となる。

配列の検索範囲を超えてアクセスが発生した場合、動作は未定義です。 ptr がヌルポインタの場合、動作は未定義です。

この関数は、バイトを順次読み取り、一致するバイトが見つかり次第停止するかのように動作します: ptr が指す配列のサイズが count より小さい場合でも、配列内で一致が見つかれば、動作は明確に定義されています。

(C11以降)

目次

パラメータ

ptr - 検査対象オブジェクトへのポインタ
ch - 検索対象のバイト値
count - 検査する最大バイト数

戻り値

バイトの位置へのポインタ、またはそのようなバイトが見つからない場合はヌルポインタ。

#include <stdio.h>
#include <string.h>
int main(void)
{
    const char str[] = "ABCDEFG";
    const int chars[] = {'D', 'd'};
    for (size_t i = 0; i < sizeof chars / (sizeof chars[0]); ++i)
    {
        const int c = chars[i];
        const char *ps = memchr(str, c, strlen(str));
        ps ? printf ("character '%c'(%i) found: %s\n", c, c, ps)
           : printf ("character '%c'(%i) not found\n", c, c);
    }
    return 0;
}

出力例:

character 'D'(68) found: DEFG
character 'd'(100) not found

参考文献

  • C23規格 (ISO/IEC 9899:2024):
  • 7.24.5.1 memchr関数 (p: TBD)
  • C17規格 (ISO/IEC 9899:2018):
  • 7.24.5.1 memchr関数 (p: 267-268)
  • C11規格 (ISO/IEC 9899:2011):
  • 7.24.5.1 memchr関数 (p: 367)
  • C99規格 (ISO/IEC 9899:1999):
  • 7.21.5.1 memchr関数 (p: 330)
  • C89/C90標準 (ISO/IEC 9899:1990):
  • 4.11.5.1 memchr関数

関連項目

文字の最初の出現を検索
(関数)