printf関数のサンプルです。第一引数は、文字列を意味する「%s」や整数を意味する「%d」などフォーマット指定子を含む文字列です。第二引数以降は、可変長引数となっており、フォーマット指定子に対応する値を渡します。
#include
#include
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」は、正確にいうと、
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」を使用します。
int8_t(符号あり8bit整数型)のフォーマット
int8_t
(8bit符号あり整数型)をフォーマットするには「%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"」のように置換されます。
サイズが保証された整数型のフォーマットのよく使うであろうものの一覧です。
PRId8int8_tのフォーマット
PRId16int16_tのフォーマット
PRId32int32_tのフォーマット
PRId64int64_tのフォーマット
PRIu8uint8_tのフォーマット
PRIu16uint16_tのフォーマット
PRIu32uint32_tのフォーマット
PRIu64uint64_tのフォーマット
整数型のフォーマットの表示幅の指定
整数フォーマットで表示幅を指定してみましょう。
表示幅を指定して右寄せ
「%5d」のように「%」の後ろに「表示幅」を指定します。デフォルトでは、整数が右寄せです。足りない桁は空白で埋められます。
# 整数の表示幅を指定する
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」のように、表示幅の前にマイナスをつけます。
// 表示幅を指定し左寄せ
表示幅を指定し左寄せで表示するサンプルです。
#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をつけます。
// 表示幅を指定し左寄せ
表示幅を指定し左寄せで表示するサンプルです。
#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」で大丈夫です。
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」を使います。
printf関数で文字をフォーマットするサンプルです。
文字リテラル
「'a'」で記述した値は、
char型
でASCIIコードとして保持しています。これを、「%c」で文字として出力します。
#include <stdio.h>
int main(void) {
char ch = 'a';
// 文字列を出力
printf("%c\n", ch);
出力結果です。
文字列のフォーマット
printf関数で
文字列
をフォーマットするには「%s」を使います。
printf関数で文字列をフォーマットするサンプルです。
#include <stdio.h>
int main(void) {
const char* message = "Hello";
// 文字列を出力
printf("%s\n", message);
出力結果です。
Hello
ポインタのフォーマット
printf関数で
ポインタ
をフォーマットするには「%p」を使います。ポインタの値(アドレス)が得られます。
printf関数でポインタをフォーマットするサンプルです。
#include <stdio.h>
int main(void) {
const char* message = "Hello";
// ポインタを出力
printf("%p\n", message);
私の環境での出力結果です。ポインタの値(アドレス)が出力されています。
0x4005c8