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