2012-05-13 2 views
12

У меня есть формат строка, как это:Как я могу напечатать одну и ту же переменную в строке несколько раз?

buf[] = "A%d,B%d,C%d,D%d,F%d,G%d,H%d,I%d,J%d"; 

, и я хочу, чтобы вставить то же целое число для каждого %d поэтому я использую:

int val = 6; 
sprintf(buf2, buf, val,val,val,val,val,val,val,val,val); 

Могу ли я использовать sprintf таким образом, что требует только меня написать val один раз, и sprintf будет использовать его для каждого %d?

ответ

15

Да, вы можете использовать %1$d каждый раз. 1$ ссылается на второй аргумент, вы, очевидно, могли бы это сделать и с другими аргументами.

Демо: http://codepad.org/xVmdJkpN

Обратите внимание, что положение спецификатор является расширением POSIX - поэтому он не может работать с каждым компилятором. Если вам это нужно, например, с компилятором Visual C++, подумайте об использовании уродливого способа повторения аргумента или вообще не используйте функцию типа printf. Другим вариантом будет использование реализации sprintf, совместимой с POSIX, или использование нескольких вызовов для добавления одного числа каждый раз в цикле (в случае, если строка формата построена динамически, что помешает вам указать правильное количество аргументов).


На боковой ноте следует избегать sprintf. Вместо этого используйте snprintf(buf2, sizeof(buf2), ....). Конечно, для этого требуется buf2, чтобы иметь статический размер, известный во время компиляции, но если вы его вручную выделите, вы можете просто использовать переменную, содержащую длину, а не sizeof(buf2).

+0

Является ли этот стандарт C? –

+0

Вы были правы в первый раз: используйте '% 1 $ d', потому что' val' - это первый аргумент строки формата. –

+0

Каковы преимущества использования snprintf над sprintf? – Rhexis

5

Нет стандартного (то есть портативного) способа сделать это.

+0

OP явно не требовал стандартного способа. Я не думаю, что есть действительно веская причина не использовать какое-либо полезное расширение в наши дни только потому, что они не в стандарте. Особенно, если вы не напишете какую-нибудь супер-потрясающую библиотеку, которую все будут использовать в ближайшее время! – ThiefMaster

+0

@ThiefMaster: Но он также не указал конкретную платформу. Например, расширение POSIX не работает в Visual C++. –

Смежные вопросы