くろょろぐ

はてダからはてブロに移行済み

strncpy()にやられた。

そうだった。これって、ヌル終端してくれなかったんだっけ。
(追記)

strncpy() 関数も同様だが、 src のうち最大でも n バイトしかコピーされない点が異なる。 警告: src の最初の n バイトの中にヌルバイトがない場合、 dest に格納される文字列はヌルで終端されないことになる。
src の長さが n よりも短い場合、 strncpy() は dest の残りをヌルバイトで埋める。

http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strcpy.3.html

いや、そもそも、このドキュメントの書き方が間違ってるだろう?こう書けばいいんだ:

dest の最初の n バイトのみが変更される。 src の文字列長を超えた部分はヌルバイトになる。

この方がよっぽど、strncpy()の動作を適切に表していると思うが。
前者の書き方では、初めの文だけ読んだ時、srcの文字列長がnに満たない時、srcの文字列長しかdestが変更されないかのように見える。しかし、実際には、destは必ずnバイトだけ変更されるのだから、それを主体にした書き方にすべきだ。そして、どう変更されるのかを説明すればいい。
コピーなんかいくらされたって、減るもんじゃない。だから、上書きされてしまう方を主体にするべきだ。あ、やっぱりヒューメインインタフェースに書いてある事っぽい。
(コメレス)

なんであんな仕様なのかよくわかんねorz

戯 2008/10/15 22:02

いや全く。
strcpy()が、文字列の完全コピーを目的としてるなら、strncpy()はそのn文字制限版と考えるのが自然(笑:「見慣れている」という意味なんだってね)だし、ならば、destはn+1バイト確保して、この範囲内に収まるように最大n文字だけコピーして、末尾に終端文字をひとつだけつけてくれる方がよっぽどうれしいのに。
(追記)実はあれかな、ランダムアクセスディスクの固定長レコードにデータを配置する事を想定してるんじゃないかな。それなら、確かにヌル埋めしないとならない。