Strcpy

strcpyは、指定したアドレスに指定した文字列をコピーするC言語関数である。 標準Cライブラリの文字列操作関数群が宣言されているヘッダーファイル string.h に含まれる。 ストリングコピーなどと呼ばれることが多い。

形式

#include <string.h>
char *strcpy(char *strDest, const char *strSrc);

機能

strDestが指す配列に、strSrcが指す文字列をコピーする。コピー元とコピー先が重なる場合の動作は、定義されない。

戻り値としてstrDestの値を返す。つまりコピー後の文字列を返すことになる。

使用例

strcpyを使用して文字列をコピーし、コピー先の文字列をprintfを使って表示する例。

#include <stdio.h> /* printfを使用するためのinclude */
#include <string.h> /* strcpyを使用するためのinclude */

int main(int argc, char **argv)
{
    char strSrc[12] = "ABCDEFGHIJ\n"; /* コピー元の文字列 */
    char strDest[12]; /* コピー先の文字列 */

    /* strDestにstrSrcの内容をコピーする */
    strcpy(strDest, strSrc);

    /* printfを使ってstrDestの内容を表示 */
    printf("%s", strDest);

    return 0;
}

実装例

strcpyを自前で定義する場合は、以下の様にする。

char *StrCpy(char *s1, const char *s2) /* strcpyと区別するため、大文字 */
{
    char *p = s1;
    while(*s1++ = *s2++); /* 代入結果が終端文字(0x00)になるまで代入し続ける */
    return p;
}

バッファオーバーランの危険性と対策

strcpyはコピー先のバッファの長さを関知しない。もしコピー元の文字列の長さがコピー先のバッファの長さよりも大きい場合は、バッファオーバーランによってメモリが破壊されたり、プログラムが異常動作したり、クラッシュしたりする危険性がある。簡単な対策として、事前に領域長計算を実行する例を示す。

char dst[80];
const size_t bufsize = sizeof(dst); /* 固定長char配列の要素数を求める */
const char* src = "abc 123";
const size_t srclen = strlen(src);
if (srclen + 1 <= bufsize) /* 1は終端NUL文字用 */
{
    memcpy(dst, src, srclen + 1);
    /* 以下でも可能だが、さらに冗長となるだけで意味はない。 */
    /*strcpy(dst, src);*/
    /*strncpy(dst, src, srclen + 1);*/ /* +1は最後に終端NUL文字を付加するために必要 */
}

strlenで文字列の長さを事前に取得しているので、もはやstrcpyを使用する必要はなく、memcpyで十分となる。

字数制限付き文字列コピー関数としてstrncpyも存在するが、書き込み先のバッファサイズを指定できるわけではないので、やはりstrcpy同様の危険性を持つことに変わりはない。

代替として、標準ライブラリの一部ではないがstrlcpyやstrcpy_sを使用することのできる処理系もある。 そのほか、単純な文字列コピー用途としてはややオーバースペックではあるが、snprintfを使用する方法もある。

関連項目

外部リンク

  • K&R
  • ANSI C
    • C89
    • C90
  • C99
  • C11
  • C17(英語版)
  • C2x(英語版)
  • Embedded C(英語版)
  • MISRA C
Cの機能
  • 関数
  • ヘッダファイル
  • 演算子
  • 文字列(英語版)
  • 文法(英語版)
  • プリプロセッサ(英語版)
  • データ型(英語版)
  • キーワード
  • フリースタンディング環境
  • 標準Cライブラリの関数
    • ctype.h(英語版)
    • stdio.h
    • math.h(英語版)
    • stdlib.h(英語版)
    • string.h(英語版)
    • time.h
    • stdarg.h(英語版)
    • POSIXライブラリ(英語版)
    標準Cライブラリ
    コンパイラ
    統合開発環境
    派生言語
    関連項目
    • カテゴリ カテゴリ