C言語のprintf文について、あれやこれや書いていこうかと思います。
まず、printf系の出力にはいくつかありますね。
主に使うのは、
fprintf(ファイルポインタ, "フォーマット", 変数, 変数, …);
sprintf(char型ポインタ, "フォーマット", 変数, 変数, …);
cprintf("フォーマット", 変数, 変数, …);
printf("フォーマット", 変数, 変数, …);
これら4つではなかろうか。
fprintfはファイルへの出力はもとより、標準出力(stdout)、エラー出力(stderr)、プリンター出力(stdprn)といった出力も可能です。
同じ内容を標準出力とエラー出力に出力して、標準出力をファイルへリダイレクトする。
といったテクニックに使えます。
fprintf(stdout, "ほげほげ");
fprintf(stderr, "ほげほげ");
C:\> hogehoge &1> hoge.txt
とやると、stdoutへの出力がhoge.txtへリダイレクトされ、stderrへの出力は画面へなされます。
sprintfは、フォーマットに沿った文字列を生成するのに便利です。
char型のポインタに受け渡すわけですが、ポインタと云うよりも配列で十分な長さを確保するのが楽かとは思います。
十分なと書いたのは、"\n"とかそういった文字や、文字列の終端を表す"\0"とかも数える必要があるということです。
cprintfは、コンソールに直接出力するものです。
コンソール入力系関数と組み合わせて、画面とキーボードとで質疑応答しながら進めていくようなプログラムでの出力に使われます。
printfは、cprintfの汎用的なものということでしょうね。
つづいて、フォーマットの話し。
10進整数表記
"%d" int型、short型
"%ld" long型
"%lld" long long int型
"%u" unsigned int型、unsigned short型
"%lu" unsigned long型
"%llu" unsigned long long int型
16進表記
アルファベットは小文字
"%x" int型、short型、unsigned int型、unsigned short型
"%lx" long型、unsigned long型
"%llx" long long int型、unsigned long long int型
アルファベットは大文字
"%X" int型、short型、unsigned int型、unsigned short型
"%lX" long型、unsigned long型
"%llX" long long int型、unsigned long long int型
8進表記
"%o" int型、short型、unsigned int型、unsigned short型
"%lo" long型、unsigned long型
"%llo" long long int型、unsigned long long int型
桁数指定による、左詰め、右詰め
"%10d" 10進数10桁で右寄せ
"%-10d" 10進数10桁で左寄せ
0パッディッング
"%04x" 16進数4桁で先頭を0でパッディングする
"%08lx" 16進数8桁で先頭を0でパッディングする
"%016llx" 16進数16桁で先頭を0でパッディングする
浮動小数型
"%f" float型
"%lf" double型
"%llf" long double型
"%g" float型を適切に出力
"%lg" double型を適切に出力
"%llg" long double型を適切に出力
"%e" float型を指数表記、小文字のe
"%le" double型を指数表記、小文字のe
"%lle" long double型を指数表記、小文字のe
"%E" float型を指数表記、大文字のE
"%lE" double型を指数表記、大文字のE
"%llE" long double型を指数表記、大文字のE
浮動小数点型の桁数指定
"%.10lf" 小数点以下を10桁
"%.10lg" 小数点以下を10桁
"%.10le" 小数点以下を10桁
"%20.10lf" 小数点以下を10桁、符号、小数点を含めてトータルで20桁
"%20.10lg" 小数点以下を10桁、符号、小数点を含めてトータルで20桁
"%20.10le" 小数点以下を10桁、符号、小数点、指数部を含めてトータルで20桁
浮動小数点型の桁数指定による左詰め
"%-20.10lf" 小数点以下を10桁、符号、小数点を含めてトータルで20桁で、左詰め
"%-20.10lf" 小数点以下を10桁、符号、小数点を含めてトータルで20桁で、左詰め
"%-20.10lf" 小数点以下を10桁、符号、小数点を含めてトータルで20桁で、左詰め
文字、文字列
"%c" char型、0から255までのASCII文字1文字
"%s" char型ポインタ、文字列
文字列の桁数指定による、左詰め、右詰め
"%20s" トータル20文字で右詰め
"%-20s" トータル20文字で左詰め
"%20.10s" トータル20文字で、先頭10文字のみ抜き出して右詰め
"%-20.10s" トータル20文字で、先頭10文字のみ抜き出して左詰め
まぁ、きりがないので、こんなところで留めておく。
こんな風に文字で書いてもイメージ湧かないだろうから、どうでもいいサンプルプログラム。
#include <stdlib.h>
int main()
{
printf("%%hd :\t[%hd]\n",12345);
printf("%%d :\t[%d]\n",1234567890);
printf("%%ld :\t[%ld]\n",1234567890L);
printf("%%lld :\t[%lld]\n",1234567890123456789LL);
printf("%%10d :\t[%10d]\n",12345);
printf("%%-10d :\t[%-10d]\n",12345);
printf("%%10d :\t[%10d]\n",-12345);
printf("%%-10d :\t[%-10d]\n",-12345);
printf("%%04x :\t[%04x]\n",0x01ab);
printf("%%04X :\t[%04X]\n",0x01ab);
printf("%%08lx :\t[%08lx]\n",0x0123abcd);
printf("%%08lX :\t[%08lX]\n",0x0123abcd);
printf("%%016llx :\t[%016llx]\n",0x0123456789abcdef);
printf("%%016llX :\t[%016llX]\n",0x0123456789abcdef);
printf("%%f :\t[%f]\n",(float)3.14159265358979323846264338327950288419716939937510);
printf("%%lf :\t[%lf]\n",(double)3.14159265358979323846264338327950288419716939937510);
printf("%%llf :\t[%llf]\n",(long double)3.14159265358979323846264338327950288419716939937510);
printf("%%g :\t[%g]\n",(float)3.14159265358979323846264338327950288419716939937510);
printf("%%lg :\t[%lg]\n",(double)3.14159265358979323846264338327950288419716939937510);
printf("%%llg :\t[%llg]\n",(long double)3.14159265358979323846264338327950288419716939937510);
printf("%%e :\t[%e]\n",(float)3.14159265358979323846264338327950288419716939937510);
printf("%%le :\t[%le]\n",(double)3.14159265358979323846264338327950288419716939937510);
printf("%%lle :\t[%lle]\n",(long double)3.14159265358979323846264338327950288419716939937510);
printf("%%.50f :\t[%.50f]\n",(float)3.14159265358979323846264338327950288419716939937510);
printf("%%.50lf :\t[%.50lf]\n",(double)3.14159265358979323846264338327950288419716939937510);
printf("%%.50llf :\t[%.50llf]\n",(long double)3.14159265358979323846264338327950288419716939937510);
printf("%%.50g :\t[%.50g]\n",(float)3.14159265358979323846264338327950288419716939937510);
printf("%%.50lg :\t[%.50lg]\n",(double)3.14159265358979323846264338327950288419716939937510);
printf("%%.50llg :\t[%.50llg]\n",(long double)3.14159265358979323846264338327950288419716939937510);
printf("%%.50e :\t[%.50e]\n",(float)3.14159265358979323846264338327950288419716939937510);
printf("%%.50le :\t[%.50le]\n",(double)3.14159265358979323846264338327950288419716939937510);
printf("%%.50lle :\t[%.50lle]\n",(long double)3.14159265358979323846264338327950288419716939937510);
printf("%%.50E :\t[%.50E]\n",(float)3.14159265358979323846264338327950288419716939937510);
printf("%%.50lE :\t[%.50lE]\n",(double)3.14159265358979323846264338327950288419716939937510);
printf("%%.50llE :\t[%.50llE]\n",(long double)3.14159265358979323846264338327950288419716939937510);
printf("%%.50f :\t[%.50f]\n",(float)3.14159265358979323846264338327950288419716939937510);
printf("%%.50lf :\t[%.50lf]\n",(double)3.14159265358979323846264338327950288419716939937510);
printf("%%.50llf :\t[%.50llf]\n",(long double)3.14159265358979323846264338327950288419716939937510);
printf("%%20.10lf:\t[%20.10lf]\n",123456789.);
printf("%%20.10lf:\t[%20.10lf]\n",12345678.9);
printf("%%20.10lf:\t[%20.10lf]\n",1234567.89);
printf("%%20.10lf:\t[%20.10lf]\n",123456.789);
printf("%%20.10lf:\t[%20.10lf]\n",12345.6789);
printf("%%20.10lf:\t[%20.10lf]\n",1234.56789);
printf("%%20.10lf:\t[%20.10lf]\n",123.456789);
printf("%%20.10lf:\t[%20.10lf]\n",12.3456789);
printf("%%20.10lf:\t[%20.10lf]\n",1.23456789);
printf("%%20.10lf:\t[%20.10lf]\n",0.123456789);
printf("%%20.10lg:\t[%20.10lg]\n",123456789.);
printf("%%20.10lg:\t[%20.10lg]\n",12345678.9);
printf("%%20.10lg:\t[%20.10lg]\n",1234567.89);
printf("%%20.10lg:\t[%20.10lg]\n",123456.789);
printf("%%20.10lg:\t[%20.10lg]\n",12345.6789);
printf("%%20.10lg:\t[%20.10lg]\n",1234.56789);
printf("%%20.10lg:\t[%20.10lg]\n",123.456789);
printf("%%20.10lg:\t[%20.10lg]\n",12.3456789);
printf("%%20.10lg:\t[%20.10lg]\n",1.23456789);
printf("%%20.10lg:\t[%20.10lg]\n",0.123456789);
printf("%%20.10le:\t[%20.10le]\n",123456789.);
printf("%%20.10le:\t[%20.10le]\n",12345678.9);
printf("%%20.10le:\t[%20.10le]\n",1234567.89);
printf("%%20.10le:\t[%20.10le]\n",123456.789);
printf("%%20.10le:\t[%20.10le]\n",12345.6789);
printf("%%20.10le:\t[%20.10le]\n",1234.56789);
printf("%%20.10le:\t[%20.10le]\n",123.456789);
printf("%%20.10le:\t[%20.10le]\n",12.3456789);
printf("%%20.10le:\t[%20.10le]\n",1.23456789);
printf("%%20.10le:\t[%20.10le]\n",0.123456789);
printf("%%-20.10lf:\t[%-20.10lf]\n",123456789.);
printf("%%-20.10lf:\t[%-20.10lf]\n",12345678.9);
printf("%%-20.10lf:\t[%-20.10lf]\n",1234567.89);
printf("%%-20.10lf:\t[%-20.10lf]\n",123456.789);
printf("%%-20.10lf:\t[%-20.10lf]\n",12345.6789);
printf("%%-20.10lf:\t[%-20.10lf]\n",1234.56789);
printf("%%-20.10lf:\t[%-20.10lf]\n",123.456789);
printf("%%-20.10lf:\t[%-20.10lf]\n",12.3456789);
printf("%%-20.10lf:\t[%-20.10lf]\n",1.23456789);
printf("%%-20.10lf:\t[%-20.10lf]\n",0.123456789);
printf("%%-20.10lg:\t[%-20.10lg]\n",123456789.);
printf("%%-20.10lg:\t[%-20.10lg]\n",12345678.9);
printf("%%-20.10lg:\t[%-20.10lg]\n",1234567.89);
printf("%%-20.10lg:\t[%-20.10lg]\n",123456.789);
printf("%%-20.10lg:\t[%-20.10lg]\n",12345.6789);
printf("%%-20.10lg:\t[%-20.10lg]\n",1234.56789);
printf("%%-20.10lg:\t[%-20.10lg]\n",123.456789);
printf("%%-20.10lg:\t[%-20.10lg]\n",12.3456789);
printf("%%-20.10lg:\t[%-20.10lg]\n",1.23456789);
printf("%%-20.10lg:\t[%-20.10lg]\n",0.123456789);
printf("%%-20.10le:\t[%-20.10le]\n",123456789.);
printf("%%-20.10le:\t[%-20.10le]\n",12345678.9);
printf("%%-20.10le:\t[%-20.10le]\n",1234567.89);
printf("%%-20.10le:\t[%-20.10le]\n",123456.789);
printf("%%-20.10le:\t[%-20.10le]\n",12345.6789);
printf("%%-20.10le:\t[%-20.10le]\n",1234.56789);
printf("%%-20.10le:\t[%-20.10le]\n",123.456789);
printf("%%-20.10le:\t[%-20.10le]\n",12.3456789);
printf("%%-20.10le:\t[%-20.10le]\n",1.23456789);
printf("%%-20.10le:\t[%-20.10le]\n",0.123456789);
printf("%%30s :\t[%30s]\n","abcdefghijklmnopqrstuvwxyz");
printf("%%-30s :\t[%-30s]\n","abcdefghijklmnopqrstuvwxyz");
printf("%%30.20s :\t[%30.20s]\n","abcdefghijklmnopqrstuvwxyz");
printf("%%-30.20s :\t[%-30.20s]\n","abcdefghijklmnopqrstuvwxyz");
return EXIT_SUCCESS;
}
とにかく試すのが一番です。
どうとでも書き換えてくださいな。
ああ、2進数表示とか、浮動小数の内部構造表示とか、やろうとか思ってたけど、…
まぁ以前やったからいいか。
このリブログ記事は頭痛くなると思うので、読むなら覚悟してみてね。
ではでは