文法:
#include <cstring> char *strncpy( char *コピー先, const char *コピー元, size_t カウント ); namespace std { using ::strncpy; }
strncpy()関数は最大でカウントで指定された文字数分、コピー元の文字列から、コピー先のバッファにコピーします。もしもコピー元の文字数が、カウントよりも短い場合には、残りの文字は'\0'文字で埋められます。結果の文字列が返り値として返されます。
警告 関数の定義を慎重に読んでください。strncpy()関数は結果の文字列がNULL終端されないこともある、ということが分かるでしょう。多くの人にとっては、これを知ると驚きますが、これには理由があり、strncpy()を以下のようなイディオムの中で使用することができます:
#include <cstring> #include <cstdlib> int main(int agrc, char *argv[]) { if (argc!=2) { return EXIT_FAILURE; } char buff[6]; strncpy(buff, argv[1], sizeof(buff)); // ここがイディオムの部分ですstrncpyを使用する場合にはこのコードを忘れないように: if (buff[sizeof(buff)-1] != '\0') { // オーバーフロー発生。エラーにすべきです: return EXIT_FAILURE; // もしくは、文字列を強制的に切りつめます: buff[sizeof(buff)-1]='\0'; } // それ以外の場合には、結果の文字列は確実にNULL(ゼロ)終端されています。 }
strncpy()を使用する場合には、それ自身では安全なコードにはならないため、上記のように正しく使用してください。そうでなければ、サンプルの後半部分では6文字のバッファには最大5文字入っていると見なしていますが、これは失敗します。失敗するとセキュリティ上の危険を及ぼします。
そうでない場合には、strncatを使用して、文字列を常にNULL終端を行って下さい:
#include <cstring> #include <cstdlib> int main(int agrc, char *argv[]) { if (argc!=2) { return EXIT_FAILURE; } char buff[6] = ""; strncat(buff, argv[1], sizeof(buff)-1); }