prinfで使う変換指定文字列の書式
変換指定文字列の書式は次のようになっている。
%[フラグ][フィールド幅][.精度][長さ修飾子]変換指定子
フラグ
フラグ | 意味 |
---|---|
# | 変換指定子がoの時に値に0を付け、変換指定子がx,Xの時に値に0xを付ける。また、変換指定子がa,A,e,E,f,F,f,g,Gの時、強制的に小数点を付ける。また、変換指定子がg,Gの時には後ろの0を取らない。 |
0 | 表示する文字列の長さがフィールド幅より小さいときに、フィールド幅の余白に0を付加 |
スペース | 表示する文字列の長さがフィールド幅より小さいときに、フィールド幅の余白にスペースを付加 |
+ | 数字に符号をつける |
- | 表示を左寄せにする。デフォルトは右寄せ |
フィールド幅と精度
個人的にこの2つは混同しやすいが、違いは以下の通り。
- 文字列の長さより小さな値をフィールド幅に指定したとき、出力は変わらない。
- 文字列の長さより小さな値を精度に指定したとき、指定した値分の文字数が出力される。
- 文字列の長さより大きな値をフィールド幅に指定したとき、(指定したフィールド幅の値 - 文字列の長さ)分の空白が挿入される。
- 文字列の長さより大きな値を精度に指定したとき、出力は変わらない。
上記の内容は以下の実験1、実験2から分かる
実験1
sample1.c
# include<stdio.h>
int main(void){
char *str;
str = "abcdef";
printf("%%3s : ");
printf("%3s\n", str);
printf("%%.3s : ");
printf("%.3s\n", str);
return 0;
}
↓実行結果
$ ./sample1
%3s : abcdef
%.3s : abc
実験2
sample2.c
# include<stdio.h>
int main(void){
char *str;
str = "abcdef";
printf("%%8s : ");
printf("%8s\n", str);
printf("%%.8s : ");
printf("%.8s\n", str);
return 0;
}
↓実行結果
$ ./sample2
%8s : abcdef
%.8s : abcdef