Scroll to navigation

STRCPY(3) Linux Programmer's Manual STRCPY(3)

名前

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 の残りをヌルバイトで埋める。

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へのポインタを返す。

準拠

SVr4, 4.3BSD, C89, C99.

注意

strncpy() は効率的でなく間違いを起こしやすいと考えるプログラマもいるだろう。 プログラマが dest の大きさが src の長さよりも 大きいことを知っている (つまり、そのことをチェックするコードを 書いている) 場合は、 strcpy() を使うことができる。

src の最初の n 文字に終端のヌルバイトがない場合、 strncpy() は dest に終端されていない文字列を生成する。 プログラマは間違いを防止するために、 以下のように強制的に終端を行うことがよくある。

strncpy(buf, str, n);
if (n > 0)

buf[n - 1]= '\0';

バグ

strcpy() の受け側の文字列が十分な大きさでない場合、何が起こるかわからない。 固定長文字列を溢れさせるのは、マシンの制御を掌中に収めるために クラッカーが好んで使うテクニックである。 プログラムでデータをバッファに読み込んだりコピーしたりする場合には、 必ずまず最初に十分な大きさがあるかどうかをチェックする必要がある。 プログラマがオーバーフローが不可能だと示せる場合には このチェックは不要かもしれないが、十分注意すること。 長い間には、不可能だったことが可能になるような方法でプログラムが 変更されることもあるからだ。

関連項目

bcopy(3), memccpy(3), memcpy(3), memmove(3), strpcpy(3), wcscpy(3), wcsncpy(3)

2009-02-04 GNU