printf_p の位置指定パラメーター
位置指定パラメーターを使用すると、書式指定文字列のフィールドをどの引数で置き換えるかを数値によって指定できます。 使用できる位置指定パラメーター printf 関数は次のとおりです。
printf、_printf_l、wprintf、_wprintf_l
_printf_p、_printf_p_l、_wprintf_p、_wprintf_p_lsprintf、_sprintf_l、swprintf、_swprintf_l、__swprintf_l
_sprintf_p、_sprintf_p_l、_swprintf_p、_swprintf_p_l_cprintf、_cprintf_l、_cwprintf、_cwprintf_l
_cprintf_p、_cprintf_p_l、_cwprintf_p、_cwprintf_p_lfprintf、_fprintf_l、fwprintf、_fwprintf_l
_fprintf_p、_fprintf_p_l、_fwprintf_p、_fwprintf_p_lvprintf、_vprintf_l、vwprintf、_vwprintf_l
_vprintf_p、_vprintf_p_l、_vwprintf_p、_vwprintf_p_lvfprintf、_vfprintf_l、vfwprintf、_vfwprintf_l
_vfprintf_p、_vfprintf_p_l、_vfwprintf_p、_vfwprintf_p_lvsprintf、_vsprintf_l、vswprintf、_vswprintf_l、__vswprintf_l
_vsprintf_p、_vsprintf_p_l、_vswprintf_p、_vswprintf_p_l
位置指定パラメーターの指定
パラメーターのインデックス付け
既定では、位置書式設定がなければ、位置指定関数の動作は他の関数と同じです。 位置指定パラメーターは、"%m$x" の形式を使用して指定します。ここで、m は書式指定文字列の前に置くパラメーター リスト内のパラメーターの位置を示す序数で、 x は、printf 関数で指定する型フィールドの文字種です。 リスト内のパラメーターは、最初の要素を 1 として順次インデックスが付けられます。 型フィールド文字の詳細については、「printf 関数の型フィールド文字」を参照してください。
この動作の例を次に示します。
_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
ただし、書式指定文字列のどこかですべての引数を少なくとも一度は使用する必要があります。
書式指定文字列で使用できる位置指定パラメーターの最大数は _ARGMAX で指定します。
文字幅と精度
* 記号を使用して文字幅または精度を引数から指定する場合、文字幅または精度の値の位置は、* 記号の直後に記述する必要があります。 次に例を示します。
_printf_p("%1$*2$s","Hello", 10);
または
_printf_p("%2$*1$s",10, "Hello");
位置指定引数とそれ以外の引数の混在
同じ書式指定文字列で位置指定パラメーターをそれ以外のパラメーターと混在させることはできません。 ただし、printf_s および関連する関数では、位置指定パラメーターを含む書式指定文字列に位置指定パラメーター以外のパラメーターを含めることができます。
使用例
// 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 argc, char *argv[])
{
int i = 1,
j = 2,
k = 3;
double x = 0.1,
y = 0.2,
z = 0.3;
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 args are numbers indicating the
// argument enclosed in curly braces.
_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);
_printf_p("%1$s %2$s %3$s\n", s1, s2, s3);
_printf_p("%3$s %1$s %2$s\n", s1, s2, s3);
}