printf_p 位置参数

位置参数提供了由参数将重写到格式字符串的字段数指定。 以下位置参数 printf 函数可用:

指定位置参数

索引参数

默认情况下,如果位置的格式不存在,位置的函数具有相同的行为与非位置部分。 格式“%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);
}
  

请参见

参考

printf 类型字段字符

printf 宽度规范

精度规范