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);
}