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