風で飛んでいくチラ裏

気ままに雑記メモ書き殴り。古い記事は別blogからの引っ越しなのでレイアウトがアレです。

strlcat

strlcpyと同じ系。

size_t strlcpy(char *dst, char *src, size_t size)

dstの末尾('\0'の位置)から、srcをくっつける。
strlen(dst) + strlen(src) > size であれば、size-1までつなげて、
末尾をヌル止めする。

sizeにはsizeof(dst)を入れるのが普通。strlen(dst)とかうっかりやりそうだけどやると コピーされない。

※追記:普通とか言っておいていきなりはまった俺w
文字列をポインタで参照している場合はsizeofではダメですた。

char ary[32] = "abcdefgh";
char *p = ary;

    strlcat(p, "hoge", sizeof(p));
    printf("ary: %s\n", ary);			// -> "abcdefgh"

これだと連結しれくれない。
なぜなら sizeof(p) は sizeof(char *) -> ポインタのサイズ(手元の環境だと4) だから。
sizeof(dst)は、dstが配列名のときは有効。

戻り値は「実際に作ろうとした」サイズ。つまり strlen(dst) + strlen(src)。
関数コール後の strlen(dst) と比較すると、最後までつなぐことができたのか分かる。