printf関数やscanf関数でおなじみの変換仕様ですが、実はとても奥が深いものです。特にsscanf関数では、変換仕様を使いこなすことにより様々な形での文字列の編集が行えます。ここでは、具体的な使い方を挙げながら変換仕様について説明してみようと思います。
printf、fprintf、sprintf などの書式出力関数で使われる変換仕様です。以下のような形式をしています。
|
※ [ ]の中は省略が可能です。
変換の型を指定する1文字です。
printf("%d %i\n", 123, 456); |
123 456 |
printf("%o\n", 123U); printf("%u\n", 456U); printf("%x\n", 7890U); printf("%X\n", 7890U); ※ U はunsignedを表す接尾語。 |
173 456 1ed2 1ED2 |
printf("%f\n", 123.45); |
123.450000 |
printf("%e\n", 123.45); printf("%E\n", 6.789); |
1.234500e+02 6.789000E+00 |
/* f形式に変換 */ printf("%g\n", 123.4); printf("%G\n", 5678.0); /* e形式に変換 */ printf("%g\n", 1000000.0); printf("%G\n", 1000000.0); |
123.4 5678 1e+06 1E+06 |
printf("%c\n", 'A'); /* ASCII文字を出力 */ printf("%c\n", 97); |
A a |
printf("%s\n", "abcde"); |
abcde |
int a; int *p = &a; /* ポインタpの値を表示 */ printf("%p %p\n", &a, p); /* 文字列リテラルのアドレスを表示 */ printf("%p\n", "abcde"); |
0012FF88 0012FF88 0040A133 ※ 値は環境に依存します。 |
int a = 0; /* 出力した*の数をaに格納する */ printf("***%n\n", &a); printf("%d\n", a); printf("*%n\n", &a); printf("%d\n", a); |
*** 3 * 1 |
/* %% で % を表示 */ printf("%%\n"); |
% |
変換指定の意味を修飾します。複数同時に使用することが可能です。その場合、順序は任意です。
/* 左詰めで10文字 */ printf("[%-10s]\n", "abc"); |
[abc ] |
/* +符号を付加 */ printf("%+d\n", 10); |
+10 |
/* 空白を付加 */ printf("[% d]\n", 10); /* 精度0で値0を変換すると文字数は0になる。 これを空白フラグで空白にする */ printf("[% .0d]\n", 0); /* +フラグと用いると空白は無視 */ printf("[%+ d]\n", 10); |
[ 10] [ ] [+10] |
/* o変換:最初に 0 を付加 */ printf("%o %#o\n", 10, 10); /* x(X)変換:最初に 0x(0X) を付加 */ printf("%x %#x\n", 10, 10); printf("%X %#X\n", 10, 10); /* e,E,f,g,G変換:小数点文字が不要な場合でも付加する */ printf("%.e %#.e\n", 10.0, 10.0); printf("%.E %#.E\n", 10.0, 10.0); printf("%.f %#.f\n", 10.0, 10.0); printf("%.g %#.g\n", 10.0, 10.0); printf("%.G %#.G\n", 10.0, 10.0); /* g,G変換:後ろに続く 0 を取り除かない */ printf("%g %#g\n", 1.23, 1.23); printf("%G %#G\n", 1.23, 1.23); |
12 012 a 0xa A 0XA 1e+01 1.e+01 1E+01 1.E+01 10 10. 1e+01 1.e+01 1E+01 1.E+01 1.23 1.23000 1.23 1.23000 |
/* フィールド幅の足りない分を 0 詰め */ printf("[%5d] [%05d]\n", 1, 1); printf("[%7.2f] [%07.2f]\n", 2.3, 2.3); /* -フラグが指定されると0フラグは無視 */ printf("[%05d] [%-5d]\n", 45, 45); /* 精度が指定されると0フラグは無視 */ printf("[%05d] [%05.0d]\n", 67, 67); |
[ 1] [00001] [ 2.30] [0002.30] [00045] [45 ] [00067] [ 67] |
▲▲TOP▲▲