strcpy

Autres langues

Langue: ja

Version: 2007-06-15 (fedora - 25/11/07)

Autres sections - même nom

Section: 3 (Bibliothèques de fonctions)

名前

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), wcscpy(3), wcsncpy(3)