2013年5月2日星期四

printf 格式


フォーマット指定子一覧
フォーマット指定子とは、C言語のprintf()、fprintf()、sprintf()、scanf()、fscanf()、sscanf()などの関数で使用する、 表示形式を指定するための記述子である。
 C言語専用と思っていると、MFC(C++)のCStringクラスやjavaのFormatterクラス(jdk1.5以降)にも使用されていたりして、 やはりしっかり覚えておかなくては、と思わせられることもある(詳細は異なるが)。 度忘れした際にはここを見ればよいように、よく使うフォーマット指定子をここにまとめておく。 なお、ANSI規格での全貌を知りたいときは、fprintfのリファレンス等を参照のこと。
出力フォーマット指定子
printf(),fprintf(),sprintf()などで使用する指定子である。
指定子対応する型説明使用例
%cchar1文字を出力する"%c"
%schar *文字列を出力する"%8s", "%-10s"
%dint, short整数を10進で出力する"%-2d","%03d"
%uunsigned int, unsigned short符号なし整数を10進で出力する"%2u","%02u"
%oint, short,
unsigned int, unsigned short
整数を8進で出力する"%06o","%03o"
%xint, short,
unsigned int, unsigned short
整数を16進で出力する"%04x"
%ffloat実数を出力する"%5.2f"
%efloat実数を指数表示で出力する"%5.3e"
%gfloat実数を最適な形式で出力する"%g"
%ldlong倍精度整数を10進で出力する"%-10ld"
%luunsigned long符号なし倍精度整数を10進で出力する"%10lu"
%lolong, unsigned long倍精度整数を8進で出力する"%12lo"
%lxlong, unsigned long倍精度整数を16進で出力する"%08lx"
%lfdouble倍精度実数を出力する"%8.3lf"
表示桁数の指定
表示桁数は<全体の幅>.<小数点以下の幅>で指定する。どちらか片方だけの指定でも良いし、まったく指定しなくても良い。指定がなければデフォルトが使用される。 <小数点以下の幅>は、文字列の場合には最大文字数の意味になる。
指定例出力結果 
printf("[%8.3f]", 123.45678);
[ 123.456]
 
printf("[%15s]", "I am a boy.");
[    I am a boy.]
 
printf("[%.6s]", "I am a boy.");
[I am a]
 
printf("[%8.3e]", 1234.5678);
[1.234e+3]
 
表示桁数の指定よりも実際の表示文字列が長くなることがある。これはsprintf()の場合に特に注意が必要である。 文字列の格納域と同じサイズにフォーマットを指定しても、配列オーバーを引き起こす可能性のあることを意味するからである。
リーディングゼロの指定
数値フィールドの場合に、ゼロ詰めを指定することができる。桁数の指定のまえにゼロを付加する。
指定例出力結果 
printf("[%08.3f]", 123.45678);
[0123.456]
 
printf("[%05d]", 1);
[00001]
 
右詰・左詰の指定
デフォルトでは右詰なので、左詰にしたいときは桁数指定のまえにマイナスをつけなければならない。
指定例出力結果 
printf("[%-15s]", "I am a boy.");
[I am a boy.    ]
printf("[%-8.3f]", 123.45678);
[123.456 ]
 
printf("[%-5d]", 1);
[1    ]
 
符号の指定
数値の表示は、デフォルトではプラス記号を出さないので、付けたいときは+を指定する。
指定例出力結果 
printf("[%+5d]", 32);
[  +32]
printf("[%+5d]", -32);
[  -32]
 
printf("[%+8.3f]", 1.414);
[  +1.414]
 
入力フォーマット指定子
scanf(),fscanf(),sscanf()などで使用する指定子である。出力フォーマット指定子とほぼ同じだが、使えないものもある。
指定子対応する型説明
%cchar1文字を入力する
%schar *文字列を入力する
%dint整数を10進数として入力する
%uunsigned int符号なし整数を10進数として入力する
%oint, short, unsigned int整数を8進数として入力する
%xint, unsigned int整数を16進数として入力する
%ffloat実数を入力する
%hdshort単精度整数を10進数として入力する
%ldlong倍精度整数を10進数として入力する
%huunsigned short符号なし単精度整数を10進数として入力する
%luunsigned long符号なし倍精度整数を10進数として入力する
%lolong, unsigned long倍精度整数を8進数として入力する
%lxlong, unsigned long倍精度整数を16進数として入力する
%lfdouble倍精度実数を入力する

没有评论: