出力フォーマットについては、 新しく実例なども上げながら説明したページを作成したので、 以下も参照ください。
書式付入出力関数(printf 文・scanf 文)の書式
printf 文・ scanf 文ってのはC言語プログラミングする人は、初心者から上級者までお世話になる標準入出力関数です。 こいつはなかなか侮れない関数なんだな。で、その書式ってのは
printf(const char *format, ...);
scanf(const char *format, ...);
ここで
...
ってのは *format
に対応した引数です。
printf
の場合は変数そのまま(文字列は先頭ポインタ)、
scanf
は変数のポインタです。
ってここまではいいんだけど、この *format
という文字列、具体的には
printf("xの値は%d\n", x);
とかってするんですが、%○○ってのがなにが何を意味してたのか忘れやすい、っていうか正確には覚えきれません。
実は、この系列の関数って結構重要なものが多いのです。
たとえば、ファイル入出力関数
fprintf()
, fscanf()
文字列書式入出力関数
sprintf()
, sscanf()
これらはプログラミングには非常に便利な機能の関数です。 これらの関数を一切使わないプログラムを探すほうが大変です。 (get,
put系で十分なものもあるじゃないかというツッコミはさておき) いずれにしても完璧に使いこなせれば便利な関数です。 (さらに、この format は
Visual C++ で使われる 文字列操作用クラス CString でもメンバ関数 Format でも使われていたりもする)
ちなみに仕様が複雑で、デバッグやエラー発生時の対処が難しいので使わない方がいいという考えもあります。
前置きが長くなりましたが、このフォーマットの表を作ってみました。
書式付出力(printf 系)
変換文字列の書式は以下の形式である。
% [フラグ][フィールド幅].[精度][h/l/L修飾][変換文字]
指定値 | フラグ(省略可) | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | フィールド幅を指定したとき、空白を右に詰めて出力する。 | ||||||||||||
+ | 数値の前に+/-の符号をつけて出力する。 | ||||||||||||
空白 | 正の数の出力のとき、数字の頭に空白(半角スペース)を出力し、負の数のときの - 符号と位置あわせをする。 | ||||||||||||
0 | フィールド幅指定の数値出力のとき、空白にあたる部分にゼロを埋める。 | ||||||||||||
# | 数値データ型に対する特別な形態で出力する。
|
指定値 | フィールド幅(省略可) |
---|---|
数値 | 出力の幅を指定する。 データの桁が指定幅より小さいときは左に空白が埋められる。 データの桁が指定幅より大きいときは、幅指定は無視されデータの桁で出力する。 実数型に対する幅指定のときは小数点も1桁と数える。 |
* | 幅指定を引数で行う。int a=3; int b=4;
printf("%*d",a,b); とすると3桁のフィールド幅で4が出力される。 |
指定値 | 精度(省略可能) | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
.数値 | 小数点以下の桁数または最大表示文字数を指定する。
|
||||||||||
.0 | 小数点以下の数を表示しない。(注:整数のとき値が0のときは何も表示されない) | ||||||||||
. | 同上。数値がないときは0を指定したとみなされる。 | ||||||||||
* | 引数で精度を指定する。 |
指定値 | h/l/L修飾(省略可能) |
---|---|
h | 変換文字が,d i, o, u, x, Xのとき対応する引数が short int または unsigned
short int であることを示す。変換文字がpのとき、対応する引数が short
int へのポインタであることを示す。
|
l | 変換文字が,d i, o, u, x, Xのとき対応する引数が long int またはunsigned
long int であることを示す。変換文字がpのとき、対応する引数が long int へのポインタであることを示す。
|
L | 変換文字が,e, E, f, g, Gのとき対応する引数がlong double であることを示す。変換文字がpのとき、対応する引数が long double へのポインタであることを示す。
|
指定値 | 変換文字 |
---|---|
o | 8進数で出力する。 |
d, i | 10進数で出力する。 |
x, X | 16進数で出力する。xは小文字、Xは大文字。 |
u | 符号なし10進数で出力する。 |
c | 文字として出力する。 |
s | 文字列として出力する。 |
f | 浮動小数点数として出力する。 froat,double の区別はない。標準の精度は6桁。
|
e, E | 指数形式で出力する。eは小文字、Eは大文字。標準の精度は6桁。 |
g, G | 通常はf変換を行うが、指数部が-5以下か有効精度以上のときは、 eまたはE変換を行う。この変換文字の意図はなるべく短く表現することである。 |
p | ポインタとして出力する。表示形式は処理系に依存する。 |
n | %n が来るまでに出力された文字数を対応するint * 型変数に代入する。
これだけは入力的な動作をする。 |
% | %自身を出力する。"%%" と書いて'%'が出力される
|
書式付入力(scanf 系)
変換文字列の書式は以下の形式である。
% [代入抑止][フィールド幅][h/l/L修飾][変換文字]
指定値 | 代入抑止(省略可能) |
---|---|
* | 代入を抑止する。読み捨てたいときに使う。 |
指定値 | フィールド幅(省略可能) |
---|---|
数値 | 入力データを個の幅で区切る。入力データの幅が指定より小さいときは通常の区切り文字で区切られる。 |
指定値 | h/l/L修飾(省略可能) |
---|---|
h | 変換文字が,d i, o, u, x, Xのとき対応する引数が short int またはunsigned
short int であることを示す。変換文字がpのとき、対応する引数が short
int へのポインタであることを示す。
|
l | 変換文字が,d i, o, u, x, Xのとき対応する引数がlong int またはunsigned
long int であることを示す。変換文字がpのとき、対応する引数が long int へのポインタであることを示す。変換文字が,e, E, f, g, Gのとき対応する引数が double であることを示す。
|
L | 変換文字が,e, E, f, g, Gのとき対応する引数がlong double であることを示す。変換文字がpのとき、対応する引数が long double へのポインタであることを示す。
|
指定値 | 変換文字 |
---|---|
o | 8進数で入力する。 |
d, i | 10進数で入力する。 |
x, X | 16進数で入力する。16進数を表す0x,0Xは付いても付かなくてもよい。 大文字小文字の区別はないのでxとXは同じ働きをする。 |
u | 符号なし10進数で入力する。 |
c | フィールド幅で示した個数の文字を読み込み、指定された配列に入れる。 指定がなければ1個だけ読み込む。配列の最後に'\0'は付加されない。空白も読み込む。 |
s | 空白以外の一連の文字列を読み込む。空白があると区切りと見なされるので 空白を含む文字列は読み込めない。配列の最後に'\0'を付加する。 |
e, E, f, g, G | 浮動小数点形式、指数形式の実数を対応するfloat 型変数に入れる。
指数文字の大文字小文字は区別しない。
|
p | ポインタとして出力する。printf の%p での出力と同じ形式である。
対応する引数はvoid * 型である。
|
n | %nがくるまでに読み込んだ文字数を対応するint * 型引数に入れる
|
% | 入力された%を読み捨てる。代入と変換は行われない。 |
[...] | スキャンセットと呼ばれる文字列集合を[]で囲ったもので、スキャンセットに合致したものだけを入力し、
スキャンセットに合致しないものに出会うと入力を終了する。 例: %[abcde] ・・・abcdeからなる文字列を読み込む。%[^abcde] ・・・abcde以外からなる文字列を読み込む。"^" は反転文字列指定。
ANSI Cの標準ではないが範囲文字列指定"-" もつかえる。%[a-et] ・・・abcdetからなる文字列を読み込む。
|
注: double 型の出力は%fなのに対し入力は%lfにしないといけない。
変換文字以外の文字を *format
で指定すると、その文字を読み捨てる。(区切り文字として扱われる)