Translations of this page?:

strncpy

文法:

    #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);
  }

関連トピック: memcpy, strchr, strcpy, strncat, strncmp

非標準の関連の関数にstrlcpystrlcatがあります。

 
• • • SitemapRecent changesRSScc