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を使用することのできる処理系もある。Microsoft Windows XP SP2以降で利用可能なWindows APIのセーフ文字列関数では、バッファサイズを指定できるStringCchCopy()
やStringCchCopyN()
が用意されている[1]。 そのほか、単純な文字列コピー用途としてはややオーバースペックではあるが、C99で標準化されたsnprintfを使用する方法もある。
脚注
- ^ About Strsafe.h - Win32 apps | Microsoft Learn
関連項目
外部リンク
strcpy(3)
– JM Project Linux Library Functions マニュアル
| |
---|---|
Cの機能 | |
標準Cライブラリの関数 | |
標準Cライブラリ | |
コンパイラ |
|
統合開発環境 | |
派生言語 |
|
関連項目 | |
|