printf関数 - 文字列をフォーマットして出力する
printf関数を使うと、文字列をフォーマットして出力できます。stdio.hヘッダをインクルードすると利用できます。
#include <stdio.h> int printf(const char * restrict format, ...);
printf関数のサンプルです。第一引数は、文字列を意味する「%s」や整数を意味する「%d」などフォーマット指定子を含む文字列です。第二引数以降は、可変長引数となっており、フォーマット指定子に対応する値を渡します。
#include <stdio.h> #include <stdint.h> int main(void) { const char* name = "Yuki Kimoto"; int32_t age = 40; printf("My name is %s. Age is %d.\n", name, age); }
出力結果です。
My name is Yuki Kimoto. Age is 40.
整数型のフォーマット
int32_t(符号あり32bit整数型)のフォーマット
int32_t型(32bit符号あり整数型)をフォーマットするには「%d」を使用します。
%d
「%d」は、正確にいうと、int型のフォーマットです。
ですので、もしint型の定義が16bitの処理系ですと、「%d」というフォーマットでは、int32_tの値は、正しく出力されません。けれども、世の中のすべての処理系が、intを32bit以上で表現していると仮定すると、int32_t型の整数を「%d」でフォーマットするコードは正しくなります。
ためしに、int32_t型の最小値を、「%d」に渡してみましょう。あなたの環境では、いかがでしょうか?
#include <stdio.h> #include <stdint.h> int main(void) { int32_t num = INT32_MIN; printf("%d\n", num); }
出力結果です。
-2147483648
サイズが保証された整数型を、完全に正しくフォーマットする方法は、この後に解説します。こちらを使う方が正確ですが、記憶上で覚えておけないという、難点があります。
int16_t(符号あり16bit整数型)のフォーマット
int16_t(16bit符号あり整数型)をフォーマットするには「%d」を使用します。
%d
int8_t(符号あり8bit整数型)のフォーマット
int8_t(8bit符号あり整数型)をフォーマットするには「%d」を使用します。
%d
int64_t(符号あり64bit整数型)のフォーマット
int64_t(64bit符号あり整数型)をフォーマットするには、この後で説明する「PRId64」を使用します。
printf("%" PRId64 "\n", num);
「%ld」や「%lld」は移植性の警告が行われることがあるので、int64_tを出力する場合は、PRId64を使っておくと安心でしょう。
uint32_t(符号なし32bit整数型)のフォーマット
uint32_t(符号なし32bit整数型)のフォーマットには「%u」を使います。理由はint32_t型のフォーマットで解説したものと同じです。
uint8_t(符号なし8bit整数型)のフォーマット
uint8_t(符号なし8bit整数型)のフォーマットには「%u」を使います。
uint16_t(符号なし16bit整数型)のフォーマット
uint16_t(符号なし16bit整数型)のフォーマットには「%u」を使います。
uint64_t(符号なし64bit整数型)のフォーマット
uint64_t(符号なし64bit整数型)のフォーマットには、この後で説明する「PRIu64」を使用します。
printf("%" PRIu64 "\n", num);
「%lu」や「%llu」は移植性の警告が行われることがあるので、int64_tを出力する場合は、PRIu64を使っておくと安心でしょう。
サイズが保証された整数型のフォーマット
サイズが保証された整数型のフォーマットを正しく出力する方法があります。int32_t型の値を、正しくフォーマットしてみましょう。inttypes.hヘッダで定義されているPRId32マクロを使用します。
#include <stdio.h> #include <stdint.h> #include <inttypes.h> int main(void) { int32_t num = INT32_MIN; printf("%" PRId32 "\n", num); }
「なんだこの書き方は...」と感じますね。C言語では、文字列リテラルは「"Foo" "Bar"」のように並べると、コンパイル時に結合されます。PRId32はマクロです。処理系の定義に応じて、適切なフォーマットの置換されます。たとえば「"%" "d" "\n"」のように置換されます。
サイズが保証された整数型のフォーマットのよく使うであろうものの一覧です。
PRId8 | int8_tのフォーマット |
---|---|
PRId16 | int16_tのフォーマット |
PRId32 | int32_tのフォーマット |
PRId64 | int64_tのフォーマット |
PRIu8 | uint8_tのフォーマット |
PRIu16 | uint16_tのフォーマット |
PRIu32 | uint32_tのフォーマット |
PRIu64 | uint64_tのフォーマット |
整数型のフォーマットの表示幅の指定
整数フォーマットで表示幅を指定してみましょう。
表示幅を指定して右寄せ
「%5d」のように「%」の後ろに「表示幅」を指定します。デフォルトでは、整数が右寄せです。足りない桁は空白で埋められます。
# 整数の表示幅を指定する %2d
fprintfの整数フォーマットで、表示幅を5桁に指定するサンプルです。5桁の右寄せになります。
#include <stdio.h> #include <stdint.h> int main(void) { int32_t num = 123; // 表示幅を5桁に指定 右寄せ printf("foo,%5d,bar\n", num); }
出力結果です。整数が5桁の右寄せで、出力されています。
foo, 123,bar
表示幅を指定して左寄せ
表示幅を指定し左寄せするには「%-5d」のように、表示幅の前にマイナスをつけます。
// 表示幅を指定し左寄せ %-5d
表示幅を指定し左寄せで表示するサンプルです。
#include <stdio.h> #include <stdint.h> int main(void) { int32_t num = 123; // 桁数を5桁に指定 左寄せ printf("foo,%-5d,bar\n", num); }
出力結果です。
foo,123 ,bar
表示幅を指定して0埋め
表示幅を指定し左寄せするには「%05d」のように、表示幅の前に0をつけます。
// 表示幅を指定し左寄せ %05d
表示幅を指定し左寄せで表示するサンプルです。
#include <stdio.h> #include <stdint.h> int main(void) { int32_t num = 123; // 桁数を5桁に指定 - 0埋め printf("foo,%05d,bar\n", num); }
出力結果です。
foo,00123,bar
整数型を16進数で表示
整数型を16進数で表示するには「%x」または「%X」を使用します。「%x」の場合は「a~z」で、「%X」の場合は「A~Z」を使って出力されます。
#include <stdio.h> #include <stdint.h> int main(void) { int32_t num = 0x34AB; printf("%x\n", num); printf("%X\n", num); }
浮動小数点型のフォーマット
printf関数の浮動小数点型のフォーマットの解説です。
浮動小数点型のフォーマット
printf関数の浮動小数点型のフォーマットは「%f」です。float型もdouble型も両方「%f」で大丈夫です。
%f
printf関数で浮動小数点を出力するサンプルです。
#include <stdio.h> #include <stdint.h> int main(void) { double num = 123.56; printf("%f\n", num); }
出力結果です。
123.560000
浮動小数の小数点以下の桁数を指定する
浮動小数の小数点以下の桁数を指定するには「%.2f」のように書きます。
printf関数で浮動小数点を小数点以下2桁で出力するサンプルです。
#include <stdio.h> #include <stdint.h> int main(void) { double num = 123.56; // 小数点以下の桁数を2桁に指定 printf("%.2f\n", num); }
出力結果です。
123.56
浮動小数点をいい感じに表示する
浮動小数点をいい感じに表示するには「%g」を使用します。指数表記で桁数が多い場合は、自動的に指数表記にしてくれます。
#include <stdio.h> #include <stdint.h> int main(void) { double num1 = 123.56; double num2 = 2.56e40; // 浮動小数点をいい感じに表示 printf("%g\n", num1); printf("%g\n", num2); }
出力結果です。
123.56 2.56e+40
文字のフォーマット
printf関数で文字をフォーマットするには「%c」を使います。
%c
printf関数で文字をフォーマットするサンプルです。文字リテラル「'a'」で記述した値は、char型でASCIIコードとして保持しています。これを、「%c」で文字として出力します。
#include <stdio.h> int main(void) { char ch = 'a'; // 文字列を出力 printf("%c\n", ch); }
出力結果です。
a
文字列のフォーマット
printf関数で文字列をフォーマットするには「%s」を使います。
%s
printf関数で文字列をフォーマットするサンプルです。
#include <stdio.h> int main(void) { const char* message = "Hello"; // 文字列を出力 printf("%s\n", message); }
出力結果です。
Hello
ポインタのフォーマット
printf関数でポインタをフォーマットするには「%p」を使います。ポインタの値(アドレス)が得られます。
%p
printf関数でポインタをフォーマットするサンプルです。
#include <stdio.h> int main(void) { const char* message = "Hello"; // ポインタを出力 printf("%p\n", message); }
私の環境での出力結果です。ポインタの値(アドレス)が出力されています。
0x4005c8