printf()は、標準出力に書式指定文字列に従ってデータを出力します。
#include <stdio.h>
int printf(const char *fmt[, argument, ...]);
引数fmtは出力するときの書式指定文字列で、あとで説明します。...には出力する値のリストを指定します。
この関数は、出力に成功したときは出力したバイト数を返し、エラーの場合はEOFを返します。
書式は次のような文字列で指定します。
%[flags] [width] [.precision] [pre-type] type
各部分の詳細は以下のとおりです。
flagsには次の表に示す出力のフラグを指定できます。
フラグ | 意味 |
---|---|
- | 指定されたフィールド幅に結果を左詰めにする。 |
+ | 出力値が符号付きの場合は、出力値の前に符号(+または-)を付ける。 |
0 | 最小幅まで0が付加される。 |
空白 | 出力値が符号付きで整数の場合、出力値の前に空白を付ける。 |
# | 書式がo、x、Xのとき0以外のすべての出力値の前に0、0x、0Xを付け、空白は出力しない。書式がe、E、f、g、Gのとき、出力値に強制的に小数点を入れる。 |
widthには 出力の文字幅(文字列にしたときの長さ)を指定します。
precisionには出力の小数点以下の文字幅を指定します。実数の場合であれば小数点以下の精度を指定します。
pre-typeにはtypeで指定する入力数値データ引数のデフォルトサイズを変更する次の表の文字を指定します。
プリタイプ | 意味 |
---|---|
h | データはshortまたはシングルバイト文字。 |
l、L | データはlongまたはワイド文字。I64のときは64ビット整数。 |
typeには次の表に示すデータの型を指定します。
タイプ | 意味 |
---|---|
c、C | 1個の文字。 |
d | intを符号付き10進整数で出力する。 |
i | intを符号付き10進整数で出力する。 |
o | intを符号なし8進整数で出力する。 |
p | ポインタを16進数で出力する。 |
u | intを符号なし10進整数で出力する。 |
x、X | intを符号なし16進整数、"abcdef"を使用。Xのときは"ABCDEF"で出力する。 |
e、E | doubleを[-]d.dddd e [+/-]ddd形式符号付きの値で出力する。 |
f | doubleを[-]dddd.dddd形式の符号付きの値で出力する。 |
g、G | doubleをfまたはeの書式のうち指定された値および精度を表現できる短い方の書式で出力する。 |
s、S | 文字列を最初のNULL文字('\0')までまたはprecisionの範囲まで出力する。Sの場合はワイド文字列。 |
出力文字列の書式にはさらに次のような決まりがあります。
・%そのものを出力するときは%%を使う
・\、'、"などを出力するときにはその前に\を付ける
次にいくつかの典型的な書式指定の例を示します。
int c = 66;
// 文字を出力して改行する
printf("%c\n", c); // 「B」と出力される
// 単に文字列を出力して改行する
printf("こんにちは\n"); // 「こんにちは」と出力される
// 整数を出力する
int n = 12 ;
int m = 101;
printf("%5d %x\n", n, m); // 「 12 65」と出力される
printf("%05d %+5d\n", n, m); // 「00012 +101」と出力される
// 実数を出力する
float f = 12.3456F;
double v = 2.3e2;
printf("%f %8.2f\n",f ,f); // 「12.345600 12.35」と出力される
printf("%e %8.2lf\n", v, v); // 「2.300000e+02 230.00」と出力される
次の例は、fgets()およびscanf()を使って文字列と整数および実数を入力し、printf()で書式を指定して出力する例です。
#include <stdio.h>
#ifdef _MSC_VER
#pragma warning(disable : 4996)
#pragma warning(disable : 6031)
#endif
int main(int argc, char* argv[])
{
char buff[BUFSIZ];
int n;
float f;
double v;
printf("文字列>");
fgets(buff, BUFSIZ, stdin);
printf("整数と実数>");
scanf("%d %f", &n, &f);
printf("文字列%s\n", buff);
v = (double)f;
printf("n=%03d n=%x f=%5.2f v=%e\n", n, n, f, v);
return 0;
}