結構嫌う人も多いらしいです。なんででしょうね。
ちょっと凝ったことをするときは、OpenBSD-man:snprintfの方がいろいろ楽かもしれません。 といっても、こちらは返り値が0以下を返すこともあるので、 このときの処理を忘れたらいけないのが少しだけ面倒です。
strlcpy,strlcatはANSIでもPOSIXでもありませんが(OpenBSD-man:strlcpyのHISTORY参照)、 *BSDに入っているTodd氏の実装はANSIで書かれたISC BSD Licenseなコードなので、 勝手に組み込まれて困る人は少ないでしょう。 autoconfでチェックして、無いなら自前のコピーをぶち込むのが常套手段です。 OpenBSDの版のコードの最終更新もすでに2年前ですし、 安定しているといっていいと思います(OpenBSD-cvs:src/lib/libc/string/strlcpy.c)。
余談
- snprintfで思いだしたのですが、
たなかさんが以前紹介されたASFRecorderのコードをちょっとだけ読んだのですが、尋常じゃないコードでした。やばい。
こんなの。
int main_function(int argc, char **argv) { ... unsigned char Buffer[MAX_CHUNK_SIZE]; ... char *bufptr; ... bufptr = Buffer; bufptr+=sprintf(bufptr,"GET %s HTTP/1.0\r\n", proxy == NULL ? file:full_path); ... bufptr+=sprintf(bufptr,"Accept: */*\r\n"); bufptr+=sprintf(...); bufptr+=sprintf(...); bufptr+=... ...
何が起こるのか想像が付かない。やばすぎる。 他にもツッコミどころ満載。 1関数あたりの行数が異様に長いところとか、 ちょっとやそっとでは修正不可能なくらいグチャグチャです。 作者はどうやってC言語を学んだのでしょうか。 とても興味深いですね(棒読み)。
- 他の例。ときどき見かけるコード。
strcat(strcat(strcpy(x, y), z), w);
こういうコードなんか見つけるとlispかよ! と、いつも心のなかでツッコミをいれてしまうのですが。