ITメモ
C言語 / Programming Language C
開発環境 / Development Environment
【Mac】Xcode【Win】Visual Stadio
基礎 / Basic
About C言語書式コメントコンパイルとリンクメイクファイル / Makefileヘッダファイル変数定数型 / Type配列 / Arrayポインタ / Pointer演算子 / Operator制御文 / Control Statement関数指定子 / 修飾子構造体と共用体 / Structure & Unionプリプロセッサ / PreprocessorthisキーワードTypedef
入出力 / Input & Output
入出力入力フォーマット指定子出力フォーマット指定子「printf」関数を使って文字を出力・表示させる方法「printf_s」関数を使って文字を出力・表示させる方法「scanf」関数を使って入力させる方法「scanf_s」関数を使って入力させる方法「getchar」関数を使って「1文字」だけ入力させる方法「gets」関数を使って「文字列」を入力させる方法
文字列 / String
文字列 / String「snprintf」関数で「配列」に文字列を書き込む方法
ネットワーク / Network
memset - メモリブロックのセット
メモリー管理
メモリー
オペレーション / Operation
ファイルを操作をする方法コマンドラインプログラム / Command-Line Programプロセス / Processソケット通信 / Socket Communication
用語集 / Glossary
サブルーチン / Subroutineスタックとキュー / Stack & Cueスレッド / Thread
C言語標準ライブラリ(ヘッダファイル)
C言語標準ライブラリ【assert.h】 - 診断機能【complex.h】 - 複素数計算【ctype.h】 - 文字操作【errno.h】 - エラー【fenv.h】 - 浮動小数点環境【float.h】 - 浮動小数点型の特性【inttypes.h】 - 整数型の書式の変換【iso646.h】 - 代替つづり(Alternate spellings)【limits.h】 - 整数型の大きさ【locale.h】 - 文化圏固有操作【math.h】 - 数学【setjmp.h】 - 非局所分岐【signal.h】 - シグナル操作【stdalign.h】 - アライメント【stdarg.h】 - 可変個数の実引数【stdatomic.h】 - アトミック操作【stdbool.h】 - 論理型および論理値【stddef.h】 - 共通の定義【stdint.h】 - 整数型【stdio.h】 - 入出力【stdlib.h】 - 一般ユーティリティ【stdnoreturn.h】 - _Noreturn【string.h】 - 文字列操作【tgmath.h】 - 型総称数学関数(Type-generic math)【threads.h】 - マルチスレッド【time.h】 - 日付及び時間【uchar.h】 - Unicodeユーティリティ【wchar.h】 - 多バイトおよびワイド文字拡張ユーティリティ【wctype.h】 - ワイド文字種分類およびワイド文字大文字小文字変換ユーティリティ
C言語ライブラリ(ヘッダファイル)
C言語ヘッダファイル【winsock.h】





【C言語】「printf」関数を使って文字を出力・表示させる方法

【C言語】
「printf」関数を使って文字を出力・表示させる方法




「printf」関数は、
標準出力に、比較的簡単に、
「値」「文字列」を出力することができる関数ですが、
細かい複雑な設定をすることも可能です。


「変換指定文字列」を使用することで、
表示スタイルなども指定できるようになっていて、
値の型に合った「変換指定子」を設定することも必要です。


それぞれの設定値の違いもまとめています。


詳しくは、
下記をご参照ください。



「printf」関数とは


「printf」関数は、
標準出力へ文字列を出力する関数の一つ。

「C言語」では、
一番最初に触れる基本的な関数の一つでもある。


「C言語」を学んで、
最初に出てくる関数ですが、
操作方法は特殊で、
意外と難しい。


出力する文字列を指定するのに、
「フォーマット指定子」などの特殊な記号を使った文字で、
変数の値などを文字列に組み込む方式が採用されている。


Back

「printf_s」関数とは


「printf_s」関数は、
「printf」関数のセキュリティを強化したバージョンと言われています。

「printf_s」関数には、
「書式指定文字列」に、
不正な形式の文字列が指定された場合に、
「エラー」となる。
「NULL」を指定しても同様に「エラー」となる。


「書式」については、 「printf」関数と使い方は同じ。



「書式指定文字列」は、
「printf」関数と「printf_s」関数の第一引数は、
「書式指定文字列」を含んだ文字列を指定することが可能。


「書式指定文字列」は、 「変換指定子」を一つ以上含む文字列のことで、
「%」記号を1文字目にすることで使用することができる。
「書式指定文字列」以外の文字列は、
そのままも文字列で出力されます。


Back

「printf」関数の書式


「printf」関数の書式は、
意外と扱いが難しかったりする。
int printf(const char * restrict format, ...);

printf(第一引数, 第二引数, ・・・);
printf(“書式文字列”, 変数1, 変数2, ・・・);
printf(第一引数(変換指定), 第二引数);
printf(第一引数(フォーマット), 第二引数);

printf("第二引数の数字は、「%d」です", 321);
printf("%0*d", 7, 123);

変換指定に「*(アスタリスク)」を使用すると、
「文字数」を「第二引数」で指定するようになり、
「変換指定」した箇所の値は、「第三引数」になる。

複数の変換指定で、
「*(アスタリスク)」を指定した場合は、



「printf」関数のサンプルコード

printf("%05d", 123);
printf("\n");
printf("%0*d", 7, 123);
printf("\n");
printf("%0*d, %0*d", 5, 123, 5, 456);

00123
0000123
00123, 00456


printf("%.5d", 123);
printf("\n");
printf("%.5f", 0.123456789);
printf("\n");
printf("%.5s", "123456789");

00123
0.12346
12345


printf("%0*d", -5, 123); printf("あああ"); ↓
123 あああ


Back

引数で使用する「変換指定」のフォーマット


引数で使用する「変換指定」のフォーマットは、
%[引数順][フラグ][最小フィールド幅][.精度][長さ修飾子]変換指定子


一番シンプルな変換指定
%変換指定子
という書式で指定する。
「変換指定文字」を利用した場合は、
最低でも、「%変換指定子」を記述することになる。


「変換指定文字列」は、

・変換指定子をひとつ以上含む文字列
・「%」記号から始まる
・「変換指定文字列」以外の文字列はそのまま出力される

などの条件があります。


「printf」関数の
引数で指定した「書式文字列」内に、
次の引数以降の「文字列」「変数の値」を組み込むには、
「%」記号の後に、
「変数の型」を表す「変換指定子」を記述することで、
引数で指定した文字列の中にある
「書式文字列」を指定した「文字列」「変数値」に置換えて、
文字列を表示することができる。



変換指定文字列「変換指定子」の種類

「変換指定子」は、
「引数」で指定した値を表示する形式を指定する。

「変換指定文字列」を使用して出力をする場合、
「変換指定子」は、

・「アルファベット」「記号」の「1文字」で指定する
・「変換指定子」を省略することはできない

というルールがある。


「変換指定子」として使える文字
変換指定子説明
d符号付きの「10進整数」を扱う「変換指定子」。
i符号付きの「10進整数」を扱う「変換指定子」。
u符号なしの「10進整数」を扱う「変換指定子」。
o符号なしの「8進整数」を扱う「変換指定子」。
x、X 符号なしの「16進整数」を扱う「変換指定子」。
「x」は、アルファベットの「小文字」で表示。
「X」は、アルファベットの「大文字」で表示。
f、F 「浮動小数点数」を扱う「変換指定子」。
「小数点以下(ddd.ddd)」を表示する
「F」は、アルファベットを「大文字」で表示する。
e、E 「浮動小数点数」を扱う「変換指定子」。
「小数」の「指数表記(ddd.ddde±dd)」
「E」は、指数を表す「e」を「大文字」で表示する。
g、G 「浮動小数点数」を扱う「変換指定子」。
小数の16進指数表記(0xddd.dddp±dd)
「f」または「e」での変換のどちらか表示が短い方で表示。
指数部が「-4」より小さい場合か、「精度指定」以上の場合に、「e」が使用される。
「G」はアルファベットを「大文字」で表示する。
a、A 「16進浮動小数点数」を扱う「変換指定子」。
「A」は、アルファベットを「大文字」で表示する。
c 「文字」を扱う「変換指定子」。
「int型」の実引数を「unsigned char型」に変換し、結果を「文字」で表示する
s 「文字列」を扱う「変換指定子」。
「文字列」への「ポインタ」を実引数に指定し、末尾にある「null文字」の直前まで表示する。
p 「ポインタ」を扱う「変換指定子」。
任意の型のポインタを実引数に指定し、16進数で表示
n 「整数へのポインタ」を扱う「変換指定子」。
現時点までに出力された文字数を整数へのポインタに格納する。
※Visual Studioではセキュリティ上の問題で標準では無効
% 「%」を表示する「変換指定子」。
「%%」と入力することで、「%」を文字として扱う。

Back



変換指定文字列「フラグ」の種類

「変換指定文字列」の「フラグ」は、
「出力位置」「変換指定文字列の意味」を設定することができる。

「フラグ」は、
・「複数指定」が可能
・「順序」は任意
・「フラグ」は省略可能
という条件で記述する。



変換指定文字列「フラグ」の一覧
フラグ説明既定値
- フィールドの左揃え 右揃え
+ 数値の前に、常に「符号(+-)」を表示するフラグ。
「正の数字」=「+」の符号を表示
「負の数字」=「-」の符号を表示
「負の数字」のみ
0 「最小桁数」に達するまで「空白」を「0」に変換して埋めるフラグ。
「整数値」の「精度指定」がされている場合
「-」フラグと同時指定された場合
などは、「0」フラグは「無効」となる。
空白で埋める
空白 「符号付き」の「数値」で符号が表示されない場合に、空白で埋めるフラグ。
「+」フラグと同時に指定された場合は、
「空白」フラグは無効となる。
何もしない
# 「o」変換(8進数表記)の場合、
先頭に「0」が追加される値が「0」の場合は何もしない
何もしない
# 「x、X」変換(16進数表記)の場合、
先頭に「0x、0X」が追加される値が「0」の場合は何もしない
何もしない
# 「e、E、f、F、a、A」変換(小数値)の場合、
小数点以下の数値を表示しない場合でも「小数点」を表示する
何もしない
# 「g、G」変換(double型)の場合、
小数点以下の数値を表示しない場合でも「.0」を表示する
何もしない
#上記以外の変換に「#」フラグを使用した場合は、未定義となる-

Back



変換指定文字列「最小フィールド幅」の種類

変換指定文字列「最小フィールド幅」は、
表示される「文字列」の「最小文字数」を指定する「変換指定文字」。

表示する文字数が、
指定よりも多い文字数の場合は、
自動で拡張され、全部表示される。

変換指定文字列「最小フィールド幅」は、
省略も可能。
使用するときだけ記述する。


変換指定文字列「最小フィールド幅」の指定は、
・正の整数値
・アスタリスク(*)
で指定する。

「アスタリスク(*)」で指定した場合は、
次の「引数」に記述する「数値」が、
「最小フィールド幅」の値として設定される。
「"%0*d, %0*d, ・・・・・", 最小フィールド幅, 変換される値, 最小フィールド幅, 変換される値...」

printf("%0*d, %0*d", 最小フィールド幅, 数値, 最小フィールド幅, 数値);

printf("%0*d, %0*d", 5, 123, 5, 456);

00123, 00456

Back



変換指定文字列「精度指定」の種類

変換指定文字列「精度指定」は、
表示する「文字列」の「文字数」を指定する「変換指定文字」

変換指定文字列「精度指定」は、
指定しない場合は「省略可能」。


変換指定文字列「精度指定」の指定は、
・「.(ピリオド)」に続く「正の整数値」
・「.(ピリオド)」に続く「アスタリスク(*)」
で指定する。
「アスタリスク(*)」指定の時の「負数」による「精度指定」には反応しない。

「アスタリスク(*)」で指定した場合は、
次の「引数」に記述する「数値」が、
「最小フィールド幅」の値として設定される。
「"%0.*d, %0.*d, ・・・・・", 精度指定, 変換される値, 精度指定, 変換される値...」

printf("%0.3d, %0.3d", 数値, 数値);
printf("%0.*d, %0.*d", 最小フィールド幅, 数値, 最小フィールド幅, 数値);

printf("%0.5d, %0.5d", 123, 456);
printf("%0*d, %0*d", 5, 123, 5, 456);

00123, 00456
00123, 00456



変換指定文字列「精度指定」の一覧
変換指定子説明既定値
d、i、o、u、x、X 最小桁数の指定
指定の値が実際の文字数よりも小さい場合は0で埋める
1
e、E、f、F 小数部(小数点の後ろの数値)の有効桁数の指定 桁の最後は丸められる(四捨五入される) 6
g、G有効桁数の指定6
s有効文字列数表示される文字列の文字数
上記以外の変換指定子に精度指定をした場合の動作は未定義です。
Back



変換指定文字列「長さ修飾子」の種類

変換指定文字列「長さ修飾子」は、
実引数の「データ型」の「サイズ」を指定する「変換指定文字」。
変換指定文字列「長さ修飾子」は、
使用しない場合は、「省略可能」です。


変換指定文字列「長さ修飾子」の一覧
長さ修飾子変換指定子データ型
hhd、i、o、u、x、Xchar型、unsigned char型
nchar型のポインタ
hd、i、o、u、x、Xshort型、unsigned short型
nshort型のポインタ
l(小文字のL)d、i、o、u、x、Xlong型、unsigned long型
nlong型のポインタ
ll(小文字のLL)d、i、o、u、x、Xlong long型、unsigned long long型
nlong long型のポインタ
La、A、e、E、f、F、g、Glong double型
jd、i、o、u、x、Xintmax_t型(対応する中で最大の整数値を扱うデータ型)
zd、i、o、u、x、Xsize_t型
td、i、o、u、x、Xptrdiff_t型(ポインタ同士を減算した値を扱う型)


「Microsoft」独自の拡張長さ修飾子
長さ修飾子変換指定子データ型
l(小文字のL)a、A、e、E、f、F、g、Glong double型
hc、C1バイト文字
I32d、i、o、u、x、X__int32型、unsigned __int32型
I64d、i、o、u、x、X__int64型、unsigned __int64型


Back