LoginSignup
0
0

More than 5 years have passed since last update.

何気なく使ってるprintfを改めて理解してみる

Last updated at Posted at 2018-05-05

prinfで使う変換指定文字列の書式

変換指定文字列の書式は次のようになっている。

%[フラグ][フィールド幅][.精度][長さ修飾子]変換指定子

フラグ

フラグ                         意味
# 変換指定子がoの時に値に0を付け、変換指定子がx,Xの時に値に0xを付ける。また、変換指定子がa,A,e,E,f,F,f,g,Gの時、強制的に小数点を付ける。また、変換指定子がg,Gの時には後ろの0を取らない。
0 表示する文字列の長さがフィールド幅より小さいときに、フィールド幅の余白に0を付加
スペース 表示する文字列の長さがフィールド幅より小さいときに、フィールド幅の余白にスペースを付加
+ 数字に符号をつける
- 表示を左寄せにする。デフォルトは右寄せ

フィールド幅と精度

個人的にこの2つは混同しやすいが、違いは以下の通り。
1. 文字列の長さより小さな値をフィールド幅に指定したとき、出力は変わらない。
2. 文字列の長さより小さな値を精度に指定したとき、指定した値分の文字数が出力される。
3. 文字列の長さより大きな値をフィールド幅に指定したとき、(指定したフィールド幅の値 - 文字列の長さ)分の空白が挿入される。
4. 文字列の長さより大きな値を精度に指定したとき、出力は変わらない。

上記の内容は以下の実験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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0