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