文字列のコピーに strcpy() 以外、より安全な関数 strncpy がC言語に用意されている。

#include <string.h>
char *strncpy(char *des, const char *src, size_t n);
 文字型配列 des に文字列 src を先頭から n バイトだけをコピー

注意点
① srcの長さがn以上のときにはn文字をコピーするが、このときに ‘\0’ の自動付加は行わないので注意が必要。
② srcの長さがnより少ない場合には、desの中の、後ろの部分に ‘\0’ で埋められる。
③ もし、src と des が重なっている場合には動作は未定義となる。

つまり、strncpy() は文字列のn文字コピーという名前だが、最後のナル文字’\0’が抜けたりするので、気をつけないといけない。

安全のため、こう使うべきだろう。

  char des[n+1];
  strncpy(des, src, n);
  des[n] = '\0';

あるいは、自分で関数をつくってしまう。 ↓お勧め。注意点の3点ともクリア。

char *strncpy(char *des, const char *src, size_t n)
{
    while (n-- > 0 && *src != '\0') *des++ = *src++;
    *des = '\0';
    return des;
}

‘\0’と0とは同一ものと認めるならば(論理的には両者は違うけど)、3行目はつぎのようにも書ける。

    while (n-- > 0 && *src) *des++ = *src++;

余談だが、Unixコマンドのコピーは
 cp source-file target-file
コピー元→コピー先という順番、strncpy() ではコピー先 ← コピー元の順。完全に逆。

何で統一性がないだろう。なぞのひとつ。

Comments are closed.

Post Navigation