あーそうだったのね
「また Golf かよ!」と周囲の奥様方(奥様?)の冷たい視線を浴びそうですが。
C ゲンガーなら誰でも一度はお世話になる printf の話。
「ある文字列を printf で表示するのに、文字数制限(何文字まで)をしたい」ということは人生誰でも一度はある事だと思います。ちなみにボクはそんなに無かったような気がします。
そんな時、printf ではこうするかと思ってました。
/* その1 */ char *str = "Hello, World!"; printf("%*s\n", 6, str);
しかし、結果はこう表示されます。
$ ./a.out Hello, World! $ _
実は、こうするには理由があったのです。D 言語で「C スタイルの文字列を writefln で表示する」という時に、
/* その1 */ char *str = "Hello, World!"; writefln("%*s", str);
としていたのです。
んで、C で↑のような事をするにはどうすれば良いのか?というと...、
/* その2 */ char *str = "Hello, World!"; printf("%.*s\n", 6, str);
$ ./a.out Hello, $ _
はい。正しく表示されましたね。
実はこの「*」と「.*」というのは、「printf」内の書式では明確な違いがあります。前者は主に「%d」とか、数値に使われる「幅指定子」で、後者は「浮動少数の小数点以下」や「文字列表示数」に使われる「精度指定子」だったと。というか「文字列」の指定に「精度指定子」が使われるなんて「ANSI C 言語 大辞典」を紐解くまで知らなかったYO!
持ってて良かった...。<大辞典