printf_p 位置参数

通过位置参数,可以按数字指定要替换为格式字符串的字段的自变量。 以下位置参数 printf 函数可用:

非位置 printf 函数 位置参数等效项
printf_printf_lwprintf_wprintf_l _printf_p_printf_p_l_wprintf_p_wprintf_p_l
sprintf_sprintf_lswprintf_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_l
fprintf_fprintf_lfwprintf_fwprintf_l _fprintf_p_fprintf_p_l_fwprintf_p_fwprintf_p_l
vprintf_vprintf_lvwprintf_vwprintf_l _vprintf_p_vprintf_p_l_vwprintf_p_vwprintf_p_l
vfprintf_vfprintf_lvfwprintf_vfwprintf_l _vfprintf_p_vfprintf_p_l_vfwprintf_p_vfwprintf_p_l
vsprintf_vsprintf_lvswprintf_vswprintf_l__vswprintf_l _vsprintf_p_vsprintf_p_l_vswprintf_p_vswprintf_p_l

如何指定位置参数

参数索引

默认情况下,如果不存在位置格式,则位置函数的行为与非位置函数的行为相同。 在格式说明符开头使用 %n$ 可将位置参数指定为格式化,其中 n 是参数列表中要格式化的参数位置。 格式字符串之后,第一个参数的参数位置从 1 开始。 格式说明符的其余部分遵循与 printf 格式说明符相同的规则。 有关格式说明符的详细信息,请参阅格式规范语法:printfwprintf 函数

下面是位置格式的示例:

_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 指定。

宽度和精度

可以使用 *n$ 指定位置参数作为宽度或精度说明符,其中 n 是参数列表中的宽度或精度参数。 宽度或精度值的位置必须紧跟 * 符号出现。 例如,

_printf_p("%1$*2$s","Hello", 10);

_printf_p("%2$*1$s", 10, "Hello");

混合位置和非位置参数

在同一格式字符串中,不得混用位置参数与非位置参数。 如果使用任何位置格式,则所有格式说明符都必须使用位置格式。 但是,printf_p 和相关函数仍然支持在不包含位置参数的格式字符串中使用非位置参数。

示例

// positional_args.c
// Build by using: cl /W4 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     i = 1,
            j = 2,
            k = 3;
    double  x = 0.1,
            y = 2.22,
            z = 333.3333;
    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 arguments are numbers followed by a $ character.
    _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);

    // The positional arguments may appear in any order.
    _printf_p("%1$s %2$s %3$s\n", s1, s2, s3);
    _printf_p("%3$s %1$s %2$s\n", s1, s2, s3);

    // Precision and width specifiers must be int types.
    _printf_p("%3$*5$f %2$.*4$f %1$*4$.*5$f\n", x, y, z, j, k);
}
1 2 3
3 1 2
1 2 1
abc def ghi
ghi abc def
333.333300 2.22 0.100

另请参阅

格式规范语法:printfwprintf 函数