Ответ 1
Да, вы можете использовать %1$d
каждый раз. 1$
ссылается на второй аргумент, вы, очевидно, могли бы сделать это и с другими аргументами.
Демо: http://codepad.org/xVmdJkpN
Обратите внимание, что спецификатор позиции является расширением POSIX, поэтому он может не работать с каждым компилятором. Если вам это нужно, например, с компилятором Visual С++, подумайте об использовании уродливого способа повторения аргумента или вообще не используйте функцию типа printf. Другим вариантом будет использование реализации sprintf, совместимой с POSIX, или использование нескольких вызовов для добавления одного числа каждый раз в цикле (в случае, если строка формата построена динамически, что помешает вам указать правильное количество аргументов).
На боковой ноте следует избегать sprintf
. Вместо этого используйте snprintf(buf2, sizeof(buf2), ....)
. Конечно, для этого требуется buf2
иметь статический размер, известный во время компиляции, но если вы его вручную выделите, вы можете просто использовать переменную, содержащую длину вместо sizeof(buf2)
.