【C言語入門】printfの使い方

【C言語入門】printfの使い方

C言語を学習する時
一番最初に使用するであろう関数が、今回紹介する printf関数 です

おなじみの hello world を作った際にも使ったと思います

この printf関数 は、一番最初に覚える関数ですが
パラメータがたくさんあるので
この記事では、printf関数 の使い方を簡単なサンプルソースとともに説明します

printfの構文

構文
#include <stdio.h>
int printf(const char * restrict format, …);

printfの説明

formatが指す文字列(書式)の制御に従って、標準出力(stdout)に出力する

formatには、それに続く実引数の出力の際の変換方法を指定する


printf関数は、与えられた実引数の前に stdout を実引数として付加した fprintf 関数と等価

JISX3010 プログラム言語C

参考:fprintfの説明


fprintf関数は,formatが指す文字列(書式)の制御に従って,streamが指すストリームへ書き込む。formatは,それに続く実引数の,出力の際の変換方法を指定する。書式に対して実引数が不足しているときの動作は,未定義とする。実引数が残っているにもかかわらず書式が尽きてしまう場合,余分の実引数は,評価するだけで無視する。fprintf関数は,書式文字列の終わりに達したときに呼出し元に復帰する。

JISX3010 プログラム言語C

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);
}
printfサンプル実行結果(その1)
printfサンプル実行結果(その1)

フィールド幅で指定した文字数よりも変換結果の文字数が多くなっても切り捨てられたりしない

変換指定子(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);
}
printfサンプル実行結果(その2)
printfサンプル実行結果(その1)

大文字と小文字の違いは、大文字で出力されるか小文字で出力されるかの違い

変換指定子(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);
}
printfサンプル実行結果(その3)
printfサンプル実行結果(その3)

変換指定子が 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);
}
printfサンプル実行結果(その4)
printfサンプル実行結果(その4)

変換指定子が 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サンプル実行結果(その5)
printfサンプル実行結果(その5)

長さ修飾子を付けることで必要とする長さ(ビット長)の出力が得られる

printfのまとめ

printf関数の使い方で

覚えておきたいのがフラグ、フィールド幅、精度の使い方です

コンソールに出力する際、体裁を整えるために良く利用します

printf関数を使用する時の注意点は

変換指定文字列の数と対応する実引数の数があっていること

変換指定子と対応する実引数の型は合わせること

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA