printf_p
位置參數
位置參數可讓您藉由數位指定自變數,以取代為格式字串中的欄位。 您可以使用下列位置參數 printf
函式:
如何指定位置參數
參數索引
如果沒有任何位置格式化,則位置函式的運作方式預設與非位置函式完全相同。 在格式規範的開頭使用 %n$
指定位置參數來格式化,其中 n
是參數清單中要格式化的參數位置。 格式字串後面的第一個引數,其參數位置從 1 開始。 格式規範的其餘部分會遵循與 printf
格式規範相同的規則。 如需格式規範的詳細資訊,請參閱 格式規格語法: printf
和 wprintf
函式。
以下是位置格式化的範例︰
_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