今日の雑記

生きることでいっぱいいっぱい

あーそうだったのね

「また 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!
持ってて良かった...。<大辞典