strcpy, strncpy - 文字列をコピーする
#include <string.h>
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);
strcpy() 関数は src が指す文字列を末尾のヌルバイト ('\0') も含めて dest が指すバッファーにコピーする。 二つの文字列は重なってはならない。受け側の文字列 dest は コピーを受け取るのに十分な大きさでなければならない。 バッファーオーバーランに気を付けること! (「バグ」の節を参照)
strncpy() 関数も同様だが、 src のうち最大でも n バイトしかコピーされない点が異なる。 警告: src の最初の n バイトの中にヌルバイトがない場合、 dest に格納される文字列はヌルで終端されないことになる。
src の長さが n よりも短い場合、 strncpy() は dest に追加のヌルバイトを書き込み、全部で n バイトが書き込まれるようにする。
strncpy() の簡単な実装は以下のような感じであろう:
char *
strncpy(char *dest, const char *src, size_t n)
{
size_t i;
for (i = 0; i < n && src[i] != '\0'; i++)
dest[i] = src[i];
for ( ; i < n; i++)
dest[i] = '\0';
return dest;
}
strcpy() 関数と strncpy() 関数は 受け側の文字列destへのポインターを返す。
この節で使用されている用語の説明については、 attributes(7)EN を参照。
| インターフェース | 属性 | 値 |
| strcpy(), strncpy() | Thread safety | MT-Safe |
POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.
strncpy() は効率的でなく間違いを起こしやすいと考えるプログラマもいるだろう。 プログラマが dest の大きさが src の長さよりも 大きいことを知っている (つまり、そのことをチェックするコードを 書いている) 場合は、 strcpy() を使うことができる。
strncpy() の正しい (かつ意図された) 用途は、 C 文字列の固定長バッファーへのコピーを、 バッファーがオーバーフローしないことと、 宛先バッファーの未使用バイトが 0 で埋められることの両方を保証しつつ行うことである。 (宛先バッファーを 0 で埋めるのは、 たいていの場合、 バッファーを媒体に書き込んだり、別のプロセスにプロセス間通信を用いて送信したりした場合に情報洩れを防ぐためである)。
src の最初の n バイトに終端のヌルバイトがない場合、 strncpy() は dest に終端されていない文字列を生成する。 buf の長さが buflen の場合、以下のようにして強制的に終端することができる。
if (buflen > 0) {
strncpy(buf, str, buflen - 1);
buf[buflen - 1]= '\0';
}
(もちろん、上記の方法では、 src に入っている情報が buflen - 1 バイトよりも多い場合には、 dest へのコピー時に情報が失われるという事実は無視している。)
いくつかのシステム (BSD、Solaris など) では以下の関数が提供されている。
size_t strlcpy(char *dest, const char *src, size_t size);
この関数は strncpy() と同様だが、 最大でも size-1 バイトしか dest にコピーをせず、 末尾への終端のヌルバイトの追加が必ず行われ、 宛先バッファー (の未使用部分) へのヌルバイトの書き込みが行われない。 この関数では strcpy() や strncpy() の持つ問題のいくつかが修正されているが、 size が小さすぎた場合にはデータが失われる問題には、 依然として呼び出し側で対処する必要がある。 この関数の返り値は src の長さである。 これにより、 末尾の切り詰めが行われたかを簡単に検出することができる。 返り値が size 以上の場合には、 末尾の切り詰めが発生している。 データロスが問題となる場合は、 呼び出し側で、 呼び出し前に引数をチェックするか、 この関数の返り値を検査するかのいずれかをしなければならない。 strlcpy() は glibc には存在せず、 POSIX による標準化もされていないが、 Linux では libbsd ライブラリ経由で利用できる。
strcpy() の受け側の文字列が十分な大きさでない場合、何が起こるかわからない。 固定長文字列を溢れさせるのは、マシンの制御を掌中に収めるために クラッカーが好んで使うテクニックである。 プログラムでデータをバッファーに読み込んだりコピーしたりする場合には、 必ずまず最初に十分な大きさがあるかどうかをチェックする必要がある。 プログラマがオーバーフローが不可能だと示せる場合には このチェックは不要かもしれないが、十分注意すること。 長い間には、不可能だったことが可能になるような方法でプログラムが 変更されることもあるからだ。
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。