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"」のように置換されます。

サイズが保証された整数型のフォーマットのよく使うであろうものの一覧です。

PRId8int8_tのフォーマット
PRId16int16_tのフォーマット
PRId32int32_tのフォーマット
PRId64int64_tのフォーマット
PRIu8uint8_tのフォーマット
PRIu16uint16_tのフォーマット
PRIu32uint32_tのフォーマット
PRIu64uint64_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

関連情報