地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

memccpy(3) で文字列をコピーする

memccpy(3)というシステム関数をご存知でしょうか? memcpyではなくmemccpyです。

こちらの関数は4.3 BSD で追加された関数ということがわかりました。 glibc に入っているので Linux でも使えます。

manを確認。 memccpy() は次のような関数です。

書式
void *memccpy(void *dest, const void *src, int c, size_t n);
説明
memccpy() はメモリ領域src からメモリ領域dest に最大でnバイトコピーする。nバイトコピーする前に文字 c が見つかると、そこでコピーを中止する。
返り値
memccpy() は、dest 中に見つかったc の次にあるキャラクター型の変数を指すポインタを返す。見つからなかった場合、 NULL を返す。

memccpy(dest, src, '\n', n) のように使えば、長さ n を超えない範囲で、src から改行まで (改行を含む) を dest に読み込むことができます。 ただし、'\0' による終端はやってくれないので、memccpy() の返り値を見て呼び出し側で処理する必要があります。

使用例としては下記のように使用できます。

assert(dest_size > 0);
if (memccpy(dest, src, '\0', dest_size - 1) == NULL) {
    // dest に入りきらない場合は自力で '\0' で終端
    dest[dest_size - 1] = '\0';
}

strlen() + memcpy() の文字列の文字列コピーより安全に使用できるのではないでしょうか?

まとめ いつ使うのか、現場でも見た事ない関数なので誰かに聞いてみたいところですね。