はじめに
こんにちは 高専一年生のメカテック部部員です
今回はプログラミング能力認定試験3級を受験したときの
新しい知識、フォーマット指定子を共有します
フォーマット指定子集(printfに使ったとき)
%d
これは符号付きの整数に変換するフォーマット指定子です
printf時のモディファイア:
与えられた値を表示するとき、少なくとも何マス確保するかを表します
最初の文字に0が入ると空白に0が埋まります
※△は空白スペースを表す
printf("%3d",31)
→ 「△31」
printf("%03d",31)
→ 「031」
printf("%1d",31)
→ 「31」
%u
これは符号なしの整数に変換するフォーマット指定子です
ちなみに符号なし整数の宣言の型は
unsigned intとなります
%o
これは8進数の整数に変換するフォーマット指定子です
コード中に書く際、
数値の頭に0をつけるとその数は8進数リテラルとなります
%x
これは16進数の整数に変換するフォーマット指定子です
コード中に書く際、
数値の頭に0xをつけるとその数は16進数リテラルとなります
-
16進数について
0~9,a~f で16進数の一桁を表します
- 0x223 = 16²×2 + 16¹×2 + 16⁰×3 = 547
- 0x2a3d = 16³×2 + 16²×10 + 16¹×3 + 16⁰×13 = 10813
※ a~f を A~F で表しても構いませんが
その際は %x も 大文字の %X で表さないといけません
%f
これは小数に変換するフォーマット指定子です
float型
、double型
の値に対応しています
printf時のモディファイア:
モディファイアが小数点のような形となります
- 整数部分は、
小数点を含めた全体の表示する最小幅(%dのモディファイアと同じ働き) - 小数部分は
小数部分の桁数を表します
printf("%5.3f",1.41421356)
→ 「1.414」
printf("%4.3f",1.41421356)
→ 「1.414」
printf("%06.3f",1.41421356)
→ 「01.414」
printf("%11.8f",1.41421356)
→ 「△1.41421356」
printf("%11.7f",1.41421356)
→ 「△△1.4142135」
%lf
これは小数に変換するフォーマット指定子です
printf関数で使う際は%fと同じ扱いを受けます
%c
これは文字に変換するフォーマット指定子です
まずこちらの式が成り立つのは当たり前ですが
printf("%c",'a')
→ 「a」
ここで少しおもしろい話があります
コンピュータは数値しか記憶できません
そのためC言語における文字には、それぞれ対応する数値が定められているのです
そしてこの数値のことを、文字定数 といいます
数値の63は文字定数として文字の?を表すので…
printf("%c",63)
→ 「?」
となります
また、char型の変数は文字を入れるとその文字定数を記憶するものなので、
char num = 'a';
printf("%c",num);
→ 「a」
これも成り立つのです
%s
これは文字列に変換するフォーマット指定子です
これが成り立つのは当たり前ですね
printf("%s","aab")
→ 「aab」
char a[4] = {'a','a','b','\0'};
printf("%s",a);
→ 「aab」
こちらも成り立ちます
aの要素数が4になっているのはヌル文字「\0」を確保するためです
printf時のモディファイア:
.がつくモディファイアです(つかなくてもよい)
.前の数字は%dと同じの最小幅、
.後の数字はその文字列の先頭から何文字を表示するかを表します
printf("%2s","aab")
→ 「aab」
printf("%3.2s","aab")
→ 「△aa」
%p
これはポインタ変数に対応したフォーマット指定子です
記憶したアドレスを表示します
int a = 10;
int *b;
b = &a;
printf("%p",b);
→ 「000000000014FEEC」(この値は環境ごとに変わります)
注意点
モディファイアの先頭に-がつくときがあります
そのとき、最小幅に影響は与えませんが
数値を左に詰めることになります
printf("%-3d",31)
→ 「31△」
printf("%-11.7f",1.41421356)
→ 「1.4142135△△」
printf("%-3.2s","aab")
→ 「aa△」
さいごに
ここまで読んでくださりありがとうございました
「これをすべて覚えたらプログラミング能力認定試験3級のフォーマット指定子の範囲は完璧!」ということはありませんのでご注意ください
参考にしていただけると幸いです