2012-05-13 13 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$は第2引数を参照していますが、あなたは明らかに他の引数も使用できます。

デモ:http://codepad.org/xVmdJkpN

注位置指定子がPOSIXの拡張機能であること - それは、すべての単一のコンパイラでは動作しない場合があります。あなたがそれを動作させるために必要な場合。 Visual C++コンパイラでは、引数を繰り返す醜い方法の使用を検討するか、printf形式の関数をまったく使用しないでください。別のオプションは、POSIX互換のsprintf実装を使用するか、または複数の呼び出しを使用してループ内で毎回1つの数値を追加することです(フォーマット文字列が動的に構築され、正しい数の引数を指定できない場合)。


注:sprintfは避けるべきです。代わりにsnprintf(buf2, sizeof(buf2), ....)を使用してください。もちろん、buf2はコンパイル時に知られている静的なサイズを持つ必要がありますが、手動で割り当てる場合は、sizeof(buf2)の代わりに長さを含む変数を使用するだけです。

+0

この規格はCですか? –

+0

あなたは初めてです。 'val 1 'は書式文字列の最初の引数であるため、'%1 $ d'を使用してください。 –

+0

sprintfにsnprintfを使用する利点は何ですか? – Rhexis

5

これを行うための標準的な(つまりポータブルな)方法はありません。

+0

OPは明示的に標準化された方法を求めていませんでした。私は、標準ではないので、今日は便利な拡張機能を使わない本当に良い理由はないと思います。特にあなたがすばらしい素晴らしいライブラリーを書いていないと、誰もがすぐに使うつもりです! – ThiefMaster

+0

@ThiefMaster:しかし彼はまた、特定のプラットフォームを指定していませんでした。たとえば、Visual C++ではPOSIX拡張が機能しません。 –

関連する問題