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。
寬度和 Prevision
當 * 符號用來指定 [寬度] 或 [整數位數是由引數,則寬度] 或 [prevision 值的位置應緊跟 * 符號。例如:
_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);
}