C言語-#2.str*cpy
はお。
メジャーな関数だけどいろいろやってる。
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 にコピーするだけ。当然バッファーチェックなんてしていない。
おしまい
この関数で習えることは「同じような関数を作ってはいけない」こと。機能がたくさんある関数を優先的に呼んでいくことでスマートになるが、失敗すると関連関数は全壊するので注意。
悉く書を信ずれば則ち書無きに如かず