風で飛んでいくチラ裏

気ままに雑記メモ書き殴り。古い記事は別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) と比較すると、最後までつなぐことができたのか分かる。

広告を非表示にする
(function(document){ var pres = document.getElementsByTagName("pre") for(var i=pres.length; i--; ){  var el = makeOl(pres[i]) pres[i].appendChild(el) } function makeOl(pre){ var ol = document.createElement("ol") , li = document.createElement("li") , df = document.createDocumentFragment() , br = pre.innerHTML.match(/\n/g) ol.className = "preLine" ol.setAttribute("role", "presentation") for(var i=br.length; i--; ){ var li2 = li.cloneNode(true) df.appendChild(li2) } ol.appendChild(df) return ol } })(document)