UNIX/Linuxの部屋 コマンド:printf

TOP UNIX/Linuxの部屋 UNIX/Linuxコマンド一覧 用語集 新版 由来/読み方辞書 環境変数マニュアル Cシェル変数 システム設定ファイル システムコール・ライブラリ ネットワークプログラミングの基礎知識 クラウドサービス徹底比較・徹底解説




コマンド printf C の printf(3) と同じような出力を行うコマンド (8進数/10進数/16進数変換) このエントリーをはてなブックマークに追加

最終更新


UNIX/Linux の printf コマンドは、C の printf(3) と同じような出力をコマンドラインから行うことができるコマンドである。



printf コマンドの基本的な使い方
printf コマンドは、引数で渡した文字列を表示する。
% printf abc
abc
→ 改行が行われない
"\n" で改行する。
% printf "abc\n"
abc
→ 改行が行われる

通常は第一引数に "%s" や "%d" などのフォーマット文字列を含める。

文字列を表示するには %s を使う
% printf "HOME=[%s]\n" $HOME

複数のフォーマットも指定できる
% printf "HOME=[%s] USER=[%s]\n" $HOME $USER

数値は %d を使う (この例では %s でも同じ):
% printf "[%d]\n" 30
[30]

5桁で右詰め:
% printf "[%5d]\n" 30
[   30]
5桁で左詰め:
% printf "[%-5d]\n" 30
[30   ]
5桁でゼロパディング:
% printf "[%05d]\n" 30
[00030]
桁数をフォーマット外から指定:
% printf "[%*s]\n" 10 abc
[       abc]


8進数/10進数/16進数変換
printf コマンドで、8進数・10進数・16進数の変換を行うことができる。
printf "%d\n" 0x10
⇒ 16進数を 10進数に
printf "%d\n" 010
⇒ 8進数を 10進数に
printf "%x\n" 10
⇒ 10進数を 16進数に
printf "%x\n" 010
⇒ 8進数を 16進数に
printf "%o\n" 0x10
⇒ 16進数を 8進数に
% printf "%o\n" 10
⇒ 10進数を 8進数に

より単純な出力だけでよいなら echo コマンドを使うとよい。ほとんどのシェルでは組み込みコマンドとして実装されているので、printf コマンドに比べて高速である。

より詳細な printf 書式は、ライブラリ関数 printf の項を参照してほしい。
>> FreeBSDオンラインマニュアル(man) FreeBSD printf(1)
>> Linuxオンラインマニュアル(man) Linux printf(1)
>> Linuxオンラインマニュアル(man) Linux printf(3)

読み方 printf (C関数) [ぷりんとえふ] [ぷりんとふ] このエントリーをはてなブックマークに追加

標準出力に文字列を出力するライブラリ関数。

printf ファミリ:
sprintf [えす・ぷりんとえふ]
fprintf [えふ・ぷりんとえふ]
snprintf [えすえぬ・ぷりんとえふ]
vprintf [ぶい・ぷりんとえふ]
vfprintf [ぶいえふ・ぷりんとえふ]
vsprintf [ぶいえす・ぷりんとえふ]
vsnprintf [ぶいえすえぬ・ぷりんとえふ]

関数 printf 標準出力に指定のフォーマットで文字列を出力するライブラリ関数 このエントリーをはてなブックマークに追加

最終更新


printf 関数は、文字列や値を標準出力に出力するライブラリ関数である。


基本的な使い方
#include <stdio.h>
int i=10;
long int li=123456787890L;
long long int lli=123456787890L;
double d=123.456;
char str[]="Hello.";
printf("%d", i); /* int を出力するには %d */
printf("%ld", li); /* long int を出力するには %ld */
printf("%lld",lli); /* long long int を出力するには %lld */
printf("%f", f); /* double を出力するには %f */
printf("%s", str); /* 文字列を出力するには %s */
printf("%%"); /* % 自体を出力するに際は %% とする */
printf("%c", 'a'); /* 文字を出力するには %c */

/* 整数表示いろいろ */
printf("%d", i); /* これが基本。左詰め。プラスなら 10 と表示。マイナスのときのみ -10 と表示 */
printf("%10d", i); /* 10 桁で右詰め表示。10桁に満たない場合は左側を空白で埋める */
printf("%-10d", i); /* 10 桁で左詰め表示。10桁に満たない場合は右側を空白で埋める */
printf("%05d", i); /* 5 桁でゼロパディング表示。5桁に満たない場合はゼロパディングして表示 */
printf("%+d" ,i); /* プラスを指定すると、常に + を表示する */
printf("%+10d" ,i); /* プラスに加え、10桁で右詰め表示。+ で 1桁使うので、数値は9桁分であることに注意 */
printf("%-+10d" ,i); /* プラスに加え、10桁で左詰め表示。*/
printf("%'d" ,12345678); /* シングルクォートを使うと 3桁ごとにカンマを出力してくれる (後述) */

/* 文字列表示いろいろ */
printf("%s", str); /* これが基本。左詰め。*/
printf("%10s", str); /* 10桁で右詰め表示。10桁に満たない場合は左側を空白で埋める */
printf("%-10s" ,str); /* 10桁で左詰め表示。10桁に満たない場合は右側を空白で埋める */
printf("%.3s", str); /* 先頭 3バイトのみ表示するので、出力は Hel となる */
printf("%.*s", 2, str); /* 桁数を動的に変更する場合は .* とする。この場合の出力は He となる */
len=3;
printf("%.*s", len, str); /* 桁数を変数で指定することもできる */

/* エスケープシーケンス等 */
printf("abc\n"); /* 改行は \n で指定 */
printf("abc\tdef"); /* タブは \t で指定 */
printf("abc\\def"); /* \\ とすると \ そのものが出力される */
printf("abc\"def"); /* \" とすると " そのものが出力される */

シングルクォートによる3桁おきのカンマ
%'d や %'f などとすると、3桁おきのカンマやピリオドについて、設定されたロケールに従って表示する。
#include <stdio.h>
#include <locale.h>
int main(){
int i= 1234567;
double d = 1234567.89;
setlocale(LC_NUMERIC, ""); /* ロケール情報を外部から指定可能とする */
printf("[%'d]\n", i);
printf("[%'f]\n", d);
}
実行例は下記のとおり。
% env LC_ALL=C ./a.out
[1234567]
[1234567.890000]
→ 標準の C ロケールでは 3桁おきのカンマなしで、小数点はピリオドである。
% env LC_ALL=ja_JP.UTF-8 ./a.out
[1,234,567]
[1,234,567.890000]
→ ja_JP とすると、3桁おきのカンマを表示す、小数点はピリオドとなる。
% env LC_ALL=de_DE.UTF-8 ./a.out
[1.234.567]
[1.234.567,890000]
→ 例えばドイツ (de_DE) とすると、3桁おきの記号はピリオドになり、小数点はカンマとなる。

\r による行頭復帰 (キャリッジリターン)
下記のように \r による行頭への復帰を行うことで、
1/15 processing...
2/15 processing...
:
15/15 processing...
Completed.
というように、同一行で進捗状況を出力することができる。fflush でバッファにたまった文字列を出力している。
#include <stdio.h>
#include <unistd.h>
int main(){
int loop = 15;
for ( int i=0 ; i<loop ; i++ ){
printf("\r%d/%d processing...", i+1, loop);
fflush(stdout);
sleep(1);
}
printf("\nCompleted.\n");
return 0;
}

printf ファミリ
printf ファミリの関数には、下記がある。
  • printf … 文字列を作成し、標準出力 (stdout) に出力
  • sprintf … 文字列を作成し、指定の変数にコピー
  • snprintf … 文字列を作成し、指定の変数にコピー。ただし変数の長さを指定する。
  • asprintf … asprintf 内でメモリを確保し、文字列を作成し、確保したメモリにコピーする。呼び出し側で free する必要がある。
  • fprintf … 文字列を作成し、指定のファイル (ストリーム) に出力
  • dprintf … 文字列を作成し、指定のディスクリプタに出力 (fopen したものではなく、open したものに対して出力する)