見出し画像

C言語-#2.str*cpy

はお。
メジャーな関数だけどいろいろやってる。

strncpy
strcpy


strncpy

char* strncpy(char* dst, const char* src, int size) {
  // 最後に null 文字つけとく
  dst[size] = '\0';

  // long(4byte) 単位で処理
  while (4 <= size) {
    size -= 4;
    *(long*)(dst + size) = *(long*)(src + size);
  }

  // 残りがあれば 1 バイト単位で処理
  while (0 < size) {
    size -= 1;
    *(char*)(dst + size) = *(char*)(src + size);
  }

  return dst;
}

 1バイト単位の代入ではなく、4バイト単位で代入していく。メリットは判定回数が減ること。4バイト未満になったら1バイトずつ代入していく。当然32ビットが前提となる(この書き方だと)。

strcpy

char* strcpy(char* dst, const char* src) {
  int len = strlen(src);
  return strncpy(dst, src, len);
}

 src 文字列の長さ分の文字を dst にコピーするだけ。当然バッファーチェックなんてしていない。

おしまい

 この関数で習えることは「同じような関数を作ってはいけない」こと。機能がたくさんある関数を優先的に呼んでいくことでスマートになるが、失敗すると関連関数は全壊するので注意。

悉く書を信ずれば則ち書無きに如かず