C言語を学習する時
一番最初に使用するであろう関数が、今回紹介する printf関数 です
おなじみの hello world を作った際にも使ったと思います
この printf関数 は、一番最初に覚える関数ですが
パラメータがたくさんあるので
この記事では、printf関数 の使い方を簡単なサンプルソースとともに説明します
目次
printfの構文
構文
#include <stdio.h>
int printf(const char * restrict format, …);
printfの説明
formatが指す文字列(書式)の制御に従って、標準出力(stdout)に出力する
formatには、それに続く実引数の出力の際の変換方法を指定する
JISX3010 プログラム言語C
printf関数は、与えられた実引数の前に stdout を実引数として付加した fprintf 関数と等価
参考:fprintfの説明
JISX3010 プログラム言語C
fprintf関数は,formatが指す文字列(書式)の制御に従って,streamが指すストリームへ書き込む。formatは,それに続く実引数の,出力の際の変換方法を指定する。書式に対して実引数が不足しているときの動作は,未定義とする。実引数が残っているにもかかわらず書式が尽きてしまう場合,余分の実引数は,評価するだけで無視する。fprintf関数は,書式文字列の終わりに達したときに呼出し元に復帰する。
formatパラメータ
formatが指す文字列(書式)は、通常の文字列と変換指定文字列から構成される
printfの返却値
成功した場合は、出力された文字数が戻り値として返る
失敗した場合は、負の値が返る
printfの使い方(サンプル)
フラグとフィールド幅のサンプル
#include <stdio.h>
int main(int argc, char *argv[]) {
char sval[] ="abcde";
int ival = 1234;
double dval = 0.123;
/*------ 変換指定文字列なし ------*/
printf("hello world\n\n");
/*------ 変換指定文字列あり ------*/
printf("flag1_1:[%-10d]\n", -1 * ival);
printf("flag1_2:[%-10d]\n", ival);
printf("flag1_3:[%-10s]\n", sval);
printf("flag1_4:[%-4s]\n", sval);
printf("\n");
printf("flag2_1:[%+10d]\n", -1 * ival);
printf("flag2_2:[%+10d]\n", ival);
printf("\n");
printf("flag3_1:[% 10d]\n", -1 * ival);
printf("flag3_2:[% 10d]\n", ival);
printf("flag3_4:[% 4d]\n", -1 * ival);
printf("flag3_5:[% 4d]\n", ival);
printf("\n");
printf("flag4_1:[%#10o]\n", ival);
printf("flag4_2:[%#10x]\n", ival);
printf("flag4_3:[%#10f]\n", dval);
printf("flag4_4:[%#10e]\n", dval);
printf("flag4_5:[%#10a]\n", dval);
printf("flag4_6:[%#10g]\n", dval);
printf("\n");
printf("flag5_1:[%010d]\n", -1 * ival);
printf("flag5_2:[%010d]\n", ival);
}
フィールド幅で指定した文字数よりも変換結果の文字数が多くなっても切り捨てられたりしない
変換指定子(i,d,x,X,f,F,e,E,g,G,a,A)のサンプル
#include <stdio.h>
int main(int argc, char *argv[]) {
int ival = 250;
double dval = 0.0123456789;
/*------ i,d,x,X,f,F,e,E,g,G,a,A ------*/
printf("%%i:[%i]\n", ival);
printf("%%d:[%d]\n", ival);
printf("\n");
printf("%%x:[%x]\n", ival);
printf("%%X:[%X]\n", ival);
printf("\n");
printf("%%f:[%f]\n", dval);
printf("%%F:[%F]\n", dval);
printf("\n");
printf("%%e:[%e]\n", dval);
printf("%%E:[%E]\n", dval);
printf("\n");
printf("%%g:[%g]\n", dval);
printf("%%G:[%G]\n", dval);
printf("\n");
printf("%%a:[%a]\n", dval);
printf("%%A:[%A]\n", dval);
}
大文字と小文字の違いは、大文字で出力されるか小文字で出力されるかの違い
変換指定子(c,p,n)のサンプル
#include <stdio.h>
int main(int argc, char *argv[]) {
char sval[] = "abcde";
int ival = 'c';
int nval = 0;
void* vval = (void*)sval;
/*------ c,p,n ------*/
printf("%%c :[%c]\n", ival);
printf("%%p :[%p]\n", vval);
printf("%%n :[%n", &nval);
printf("%d]\n", nval);
}
変換指定子が n は、他の変換指定子と動作が異なり直前まで出力した文字数を対応する実引数への出力する
フィールド幅と精度のサンプル
#include <stdio.h>
int main(int argc, char *argv[]) {
char sval[] = "abcde";
int ival = 2500;
double dval = 0.012345;
/*------ 精度のみ ------*/
printf("%%.3s :[%.3s]\n", sval);
printf("%%.10s:[%.10s]\n", sval);
printf("\n");
printf("%%.3d :[%.3d]\n", ival);
printf("%%.10d:[%.10d]\n", ival);
printf("\n");
printf("%%.3f :[%.3f]\n", dval);
printf("%%.10f:[%.10f]\n", dval);
printf("\n");
printf("%%.3e :[%.3e]\n", dval);
printf("%%.10e:[%.10e]\n", dval);
printf("\n");
/*------ フィールド幅と精度 ------*/
printf("%%13.3s :[%13.3s]\n", sval);
printf("%%13.10s:[%13.10s]\n", sval);
printf("\n");
printf("%%13.3d :[%13.3d]\n", ival);
printf("%%13.10d:[%13.10d]\n", ival);
printf("\n");
printf("%%13.3f :[%13.3f]\n", dval);
printf("%%13.10f:[%13.10f]\n", dval);
printf("\n");
printf("%%17.3e :[%17.3e]\n", dval);
printf("%%17.10e:[%17.10e]\n", dval);
}
変換指定子が s の場合
精度で出力する最大文字数を指定できる
変換指定子が d の場合
精度で指定した文字数に桁数が満たない分、右側に 0 充填される
変換指定子が f, e の場合
小数点以下の桁数が精度で指定した文字数に満たない分、左側に 0 充填される
変換指定子が e の場合
整数部の桁数、小数点、指数表示部分文字数に精度で指定した文字数を加えたものが表示に必要となる最小フィールド幅になる
長さ修飾子のサンプル
#include <stdio.h>
int main(int argc, char *argv[]) {
long long int llval = -1LL;
/*------ 長さ修飾子 ------*/
printf("%%hhx :[%hhx]\n", (char)llval);
printf("%%x :[%x]\n", (char)llval);
printf("%%hx :[%hx]\n", (short)llval);
printf("%%x :[%x]\n", (short)llval);
printf("%%llx :[%llx]\n", llval);
printf("%%x :[%x]\n", (unsigned int)llval);
printf("\n");
printf("%%hhd :[%hhd]\n%%hd :[%hd]\n%%ld :[%ld]\n",
(char)llval, (short)llval, (long)llval);
}
長さ修飾子を付けることで必要とする長さ(ビット長)の出力が得られる
printfのまとめ
printf関数の使い方で
覚えておきたいのがフラグ、フィールド幅、精度の使い方です
コンソールに出力する際、体裁を整えるために良く利用します
printf関数を使用する時の注意点は
変換指定文字列の数と対応する実引数の数があっていること
変換指定子と対応する実引数の型は合わせること