printf_p 位置参数printf_p Positional Parameters

位置参数可以按要替换到格式字符串中字段的自变量的编号进行指定。Positional parameters provide the ability to specify by number which of the arguments is to be substituted into a field in a format string. 以下位置参数 printf 函数可用:The following positional parameter printf functions are available:

非位置 printf 函数Non-positional printf functions 位置参数等效项Positional parameter equivalents
printf、_printf_l、wprintf、_wprintf_lprintf, _printf_l, wprintf, _wprintf_l _printf_p、_printf_p_l、_wprintf_p、_wprintf_p_l_printf_p, _printf_p_l, _wprintf_p, _wprintf_p_l
sprintf、_sprintf_l、swprintf、_swprintf_l、__swprintf_lsprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l _sprintf_p、_sprintf_p_l、_swprintf_p、_swprintf_p_l_sprintf_p, _sprintf_p_l, _swprintf_p, _swprintf_p_l
_cprintf、_cprintf_l、_cwprintf、_cwprintf_l_cprintf, _cprintf_l, _cwprintf, _cwprintf_l _cprintf_p、_cprintf_p_l、_cwprintf_p、_cwprintf_p_l_cprintf_p, _cprintf_p_l, _cwprintf_p, _cwprintf_p_l
fprintf、_fprintf_l、fwprintf、_fwprintf_lfprintf, _fprintf_l, fwprintf, _fwprintf_l _fprintf_p、_fprintf_p_l、_fwprintf_p、_fwprintf_p_l_fprintf_p, _fprintf_p_l, _fwprintf_p, _fwprintf_p_l
vprintf、_vprintf_l、vwprintf、_vwprintf_lvprintf, _vprintf_l, vwprintf, _vwprintf_l _vprintf_p、_vprintf_p_l、_vwprintf_p、_vwprintf_p_l_vprintf_p, _vprintf_p_l, _vwprintf_p, _vwprintf_p_l
vfprintf、_vfprintf_l、vfwprintf、_vfwprintf_lvfprintf, _vfprintf_l, vfwprintf, _vfwprintf_l _vfprintf_p、_vfprintf_p_l、_vfwprintf_p、_vfwprintf_p_l_vfprintf_p, _vfprintf_p_l, _vfwprintf_p, _vfwprintf_p_l
vsprintf、_vsprintf_l、vswprintf、_vswprintf_l、__vswprintf_lvsprintf, _vsprintf_l, vswprintf, _vswprintf_l, __vswprintf_l _vsprintf_p、_vsprintf_p_l、_vswprintf_p、_vswprintf_p_l_vsprintf_p, _vsprintf_p_l, _vswprintf_p, _vswprintf_p_l

如何指定位置参数How to specify positional parameters

参数索引Parameter indexing

默认情况下,如果不存在位置格式,则位置函数的行为与非位置函数的行为相同。By default, if no positional formatting is present, the positional functions behave identically to the non-positional ones. 在格式说明符开头使用 %n$ 可将位置参数指定为格式化,其中 n 是参数列表中要格式化的参数位置。You specify the positional parameter to format by using %n$ at the beginning of the format specifier, where n is the position of the parameter to format in the parameter list. 格式字符串之后,第一个参数的参数位置从 1 开始。The parameter position starts at 1 for the first argument after the format string. 格式说明符的其余部分遵循与 printf 格式说明符相同的规则。The remainder of the format specifier follows the same rules as the printf format specifier. 有关格式说明符的详细信息,请参阅格式规范语法:printf 和 wprintf 函数For more information about format specfiers, see Format Specification Syntax: printf and wprintf Functions.

下面是位置格式的示例:Here's an example of positional formatting:

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

显示为:This prints:

November 10  

所使用的数字顺序不需要与自变量顺序匹配。The order of the numbers used doesn't need to match the order of the arguments. 例如,下面是一个有效的格式字符串:For example, this is a valid format string:

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

显示为:This prints:

10 November  

与传统的格式字符串不同,位置参数可多次在格式字符串中使用。Unlike traditional format strings, positional parameters may be used more than once in a format string. 例如,For example,

_printf_p("%1$d times %1$d is %2$d", 10, 100);  

显示为:This prints:

10 times 10 is 100  

所有自变量都必须在格式字符串中的某个位置至少使用一次。All arguments must be used at least once somewhere in the format string. 格式字符串中允许的位置参数的最大数量由 _ARGMAX 指定。The maximum number of positional parameters allowed in a format string is given by _ARGMAX.

宽度和精度Width and precision

可以使用 *n$ 指定位置参数作为宽度或精度说明符,其中 n 是参数列表中的宽度或精度参数。You can use *n$ to specify a positional parameter as a width or precision specifier, where n is the position of the width or precision parameter in the parameter list. 宽度或精度值的位置必须紧跟 * 符号出现。The position of the width or precision value must appear immediately following the * symbol. 例如,For example,

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

or

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

混合位置和非位置参数Mixing positional and non-positional arguments

在同一格式字符串中,不得混用位置参数与非位置参数。Positional parameters may not be mixed with non-positional parameters in the same format string. 如果使用任何位置格式,则所有格式说明符都必须使用位置格式。If any positional formatting is used, all format specifiers must use positional formatting. 但是,printf_p 和相关函数仍然支持在不包含位置参数的格式字符串中使用非位置参数。However, printf_p and related functions still support non-positional parameters in format strings containing no positional parameters.

示例Example

// 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

另请参阅See Also

格式规范语法:printf 和 wprintf 函数Format Specification Syntax: printf and wprintf Functions