printf_p
位置パラメーター
位置指定パラメーターを使用すると、書式指定文字列内のフィールドに置き換える引数を数値で指定できます。 次の位置指定パラメーター printf
関数を使用できます。
位置指定パラメーターの指定方法
パラメーターのインデックス作成
既定では、位置指定の書式設定がない場合、位置指定関数の動作は、位置指定でないものと同じです。 書式設定する位置指定パラメーターは、書式指定子の先頭で %n$
を使用して指定します。ここで、n
は、パラメーター リストでの書式設定するパラメーターの位置を示します。 パラメーターの位置を示す値は、書式指定文字列の後の最初の引数を表す 1 から始まります。 書式指定子の残りの部分には、printf
の書式指定子と同じルールが適用されます。 書式指定子の詳細については、「 Format 仕様の構文: printf
関数と wprintf
関数を参照してください。
位置指定の書式設定の例を次に示します。
_printf_p("%1$s %2$s", "November", "10");
この例では、次の内容が出力されます。
November 10
使用する数値の順序は、引数の順序と一致している必要はありません。 たとえば、有効な書式指定文字列を次に示します。
_printf_p("%2$s %1$s", "November", "10");
この例では、次の内容が出力されます。
10 November
従来の書式指定文字列とは異なり、位置指定パラメーターを書式指定文字列内に複数回使用できます。 たとえば、 にします。
_printf_p("%1$d times %1$d is %2$d", 10, 100);
この例では、次の内容が出力されます。
10 times 10 is 100
書式指定文字列のどこかに、すべての引数を必ず 1 回以上使用する必要があります。 1 つの書式指定文字列で使用できる位置指定パラメータの最大数は、_ARGMAX
で指定されます。
幅と精度
*n$
を使用して位置指定パラメーターを幅指定子または有効桁数指定子として指定できます。ここで、n
は、パラメーター リストでの幅指定パラメーターまたは有効桁数のパラメーターの位置を示します。 幅または有効桁数の値は、* シンボルの直後に指定する必要があります。 たとえば、 にします。
_printf_p("%1$*2$s","Hello", 10);
または
_printf_p("%2$*1$s", 10, "Hello");
位置指定引数とそれ以外の引数の混在
同一の書式指定文字列では、位置指定パラメーターと位置指定以外のパラメーターは混在できません。 位置指定の書式を使用する場合は、すべての書式指定子で位置指定の書式設定を使用する必要があります。 ただし、位置指定以外のパラメーターを含む書式指定文字列では、printf_p
および関連する関数は、位置指定以外のパラメーターを引き続きサポートします。
例
// positional_args.c
// Build by using: cl /W4 positional_args.c
// Positional arguments allow the specification of the order
// in which arguments are consumed in a formatting string.
#include <stdio.h>
int main()
{
int i = 1,
j = 2,
k = 3;
double x = 0.1,
y = 2.22,
z = 333.3333;
char *s1 = "abc",
*s2 = "def",
*s3 = "ghi";
// If positional arguments are unspecified,
// normal input order is used.
_printf_p("%d %d %d\n", i, j, k);
// Positional arguments are numbers followed by a $ character.
_printf_p("%3$d %1$d %2$d\n", i, j, k);
// The same positional argument may be reused.
_printf_p("%1$d %2$d %1$d\n", i, j);
// The positional arguments may appear in any order.
_printf_p("%1$s %2$s %3$s\n", s1, s2, s3);
_printf_p("%3$s %1$s %2$s\n", s1, s2, s3);
// Precision and width specifiers must be int types.
_printf_p("%3$*5$f %2$.*4$f %1$*4$.*5$f\n", x, y, z, j, k);
}
1 2 3
3 1 2
1 2 1
abc def ghi
ghi abc def
333.333300 2.22 0.100