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() の文字列の文字列コピーより安全に使用できるのではないでしょうか?
まとめ いつ使うのか、現場でも見た事ない関数なので誰かに聞いてみたいところですね。