n

普段から使っているプログラミング言語でも知らないことは多い。特に頻出する部分は逆に知った気になってあまりあらためて確認したりはしないものだ。Cでprintf(fprintfやsprintfでもいいけど)といえばそれこそ出てこないプログラムの方が少ないのではないかとさえ思うのだが、何の気なしに「ANSI C言語辞典」を見ていたら初めて見る機能があった。書式指定子の中の変換指定子にnというのがあるではないか。
とりあえず規格(JISX3010:2003の7.19.6.1)の文章をここに引用しよう。

実引数は、符号付き整数型へのポインタでなければならない。このfprintfの呼出しでその時点までに出力ストリームに書き込まれた文字数を、この整数に格納する。この指定は実引数の変換は行わないが、実引数を1個使用する。この変換指定が、いずれかのフラグ、フィールド幅又は精度を含む場合、その動作は、未定義とする。

fprintfは出力のためのものという意識があるが、結果を格納する機能もあるのだ。わかり易くサンプルコードを書くとこんな感じだろうか。

#include <stdio.h>

int main() {
  int size;
  printf("%d%n\n",320,&size);
  printf("%d\n",size);
  return 0;
}

あって特に便利というほどのものでもないが、Golfで使えそうな予感。

ANSI C言語辞典

ANSI C言語辞典


Document ID: 284ad9bd8b16a680325390c196401980