この記事では、C言語のprintf()関数の使い方を解説します。
printf()
関数を使うことで引数に指定した文字列を標準出力(ターミナルやコマンドプロンプト)に出力することができます。また、変換指定子を用いることでint
型やfloat
型などの値も文字列に埋め込んで出力することができます。
演算結果などをすぐに確認することができるのでデバッグや学習にも役立ちます。
それでは、printf()
関数の使い方を見ていきましょう!
printf()
関数は、引数に指定した文字列をターミナルやコマンドプロンプトに出力することができます。
#include <stdio.h>
int main(void) {
printf("Hello World");
}
実行結果
Hello World
printf()
関数は、末尾で改行されない。
#include <stdio.h>
int main(void){
printf("Hello");
printf("World");
}
実行結果
HelloWorld
改行させたい場合は改行文字\n
を改行させたい箇所に記述します。
#include <stdio.h>
int main(void) {
printf("Hello\nWorld\n");
}
実行結果
Hello
World
これで文字列を改行させながら出力する方法がわかりました。
エスケープシーケンスとは、改行などの特殊な文字を表現するための機能で\
と文字などを組み合わせて構成されています。(先ほどの改行文字もエスケープシーケンス)
主に使われるエスケープシーケンスは以下の通りです。
エスケープシーケンス | 意味 |
---|---|
\b | バックスペース |
\n | 改行 |
\t | 水平タブ |
\v | 垂直タブ |
その他にもたくさんのエスケープシーケンスが用意されています。気になる方は以下のリンクを参照してください。
Linkエスケープ シーケンス | Microsoft Docs
文字列中にエスケープシーケンスを含めて出力してみます。
#include <stdio.h>
int main(void) {
printf("改行\n改行\n");
printf("タブ\tタブ\n");
}
実行結果
改行
改行
タブ タブ
\
や'
などを出力することもできる。
#include <stdio.h>
int main(void) {
printf("\'\n");
printf("\"\n");
printf("\\\n");
}
実行結果
'
"
\
パーセント記号(%)を出力するには%%
と記述します。
#include <stdio.h>
int main(void) {
printf("%%\n");
}
実行結果
%
出力する文字列中に変換指定子を記述し、第二引数以降にリテラルや変数を指定する。そうすることでリテラルや変数の値を変換指定子に埋め込んで出力することができます。
printf("変換指定子1 変換指定子2", 変換指定子1に埋め込む値、 変換指定子2に埋め込む値)
以下のコードでは、変換指定子 %s
に "田中"
を埋め込んで出力しています。
#include <stdio.h>
int main(void) {
printf("name: %s\n", "田中");
}
実行結果
name: 田中
変数の値を埋め込むことも、複数の値を指定することもできます。
#include
int main(void) {
char *name = "田中";
char *gender = "男";
short age = 28;
printf("name: %s, gender: %s, age: %d\n", name, gender, age);
}
実行結果
name: 田中, gender: 男, age: 28
変換指定子は、埋め込む値のデータ型によって異なります。
変換指定子には、以下のようなものがあります。
指定子 | 型 | 説明 |
---|---|---|
%c | char | 1文字 |
%s | char*、char[] | 文字列 |
%d | int、short | 整数(10進数) |
%u | unsigned int, unsigned short | 符号なし整数(10進数) |
%o | int, short, unsigned int, unsigned short | 整数(8進数) |
%x | int, short, unsigned int, unsigned short | 整数(16進数) |
%f | float | 浮動小数点数 |
%e | float | 浮動小数点数の指数表示 |
%g | float | 浮動小数点数の最適表示 |
%ld | long | 倍精度整数(10進数) |
%lu | unsigned long | 符号なし倍精度整数(10進数) |
%lo | long, unsigned long | 倍精度整数(8進数) |
%lx | long, unsigned long | 倍精度整数(16進数) |
%lf | double | 倍精度浮動小数点数 |
%a | double | 倍精度浮動小数点数(16進数) |
簡単なサンプルを見てみましょう!
#include <stdio.h>
int main(void) {
printf("char: %c\n", 'A'); // char: A
printf("char*: %s\n", "ABC"); // char*: ABC
printf("int: %d\n", 1); // int: 1
printf("整数(16進数): %x\n", 31); // 整数(16進数): 1f
printf("float: %f\n", 3.14); // float: 3.140000
}
char
型の値は、%c
に埋め込むと文字、%d
に埋め込むと数字として扱われます。
#include <stdio.h>
int main(void) {
char c = 97;
printf("c: %c\n", c);
printf("d: %d\n", c);
}
実行結果
c: a
d: 97
変換指定子は以下のように書式を設定することができます。
%[フラグ][フィールド幅][.精度]変換指定子
書式を設定することで左詰めしたり表示桁数を指定することができます。
フィールド幅を指定することで出力する文字幅を指定することができます。
#include <stdio.h>
int main(void) {
int n = 1;
// フィールド幅 5
printf("フィールド幅 5: %5d\n", n);
// フィールド幅 10
printf("フィールド幅 10: %10d\n", n);
}
実行結果
フィールド幅 5: 1
フィールド幅 10: 1
フラグは表示オプションのようなもので以下が用意されています。
フラグ | 説明 |
---|---|
- | 左詰め |
+ | 符号の表示 |
0 | フィールドを0で埋める |
試しにフラグを設定して出力してみます。
#include <stdio.h>
int main(void) {
int n = 1;
// フィールド幅 5 と 左寄せ
printf("左寄せ: %-5d\n", n);
// フィールド幅 5 と 符号表示
printf("符号表示: %+5d\n", n);
// フィールド幅 5 と 0埋め
printf("0埋め: %05d\n", n);
}
実行結果
左寄せ: 1
符号表示: +1
0埋め: 00001
精度は使用する変換指定子によって意味が異なります。
変換指定子 | 意味 |
---|---|
%d | 指定した精度よりも桁数が足りない場合、0で埋められる |
%f, %e | 小数点以下の桁数を指定できる |
%g | 有効数字の桁数を指定できる |
%s | 最大文字数を指定できる |
精度は、変換指定子の%
と文字の間に.整数
で指定します。例えば、%d
の精度を設定するには以下のように記述します。
%.整数d
では、色々な変換指定子に精度を設定してみます。
#include <stdio.h>
int main(void) {
// %d
int n = 123;
printf("n: %.2d\n", n); // n: 123
printf("n: %.5d\n", n); // n: 00123
// %f, %e
float f = 1.0;
printf("f: %.2f\n", f); // f: 1.00
printf("f: %.5f\n", f); // f: 1.00000
// %g
float g = 123.456;
printf("g: %.2g\n", g); // g: 1.2e+02
printf("g: %.5g\n", g); // g: 123.46
// %s
char *s = "abcdefg";
printf("s: %.2s\n", s); // s: ab
printf("s: %.5s\n", s); // s: abcde
}
それぞれ異なった効果を持つので注意してください。
この記事では、C言語のprintf関数の使い方を解説しました。
printf関数を使うことでターミナルなどに文字列を出力し、デバッグや確認を行うことができます。また、書式を指定することで見やすく表示することができます。
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ