14

私はこのようなフォーマット文字列を持っています:

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だけ書くだけで、それぞれに使うことができますか?valsprintf%d

4

2 に答える 2

19

はい、いつでもご利用いただけます%1$d。参照は2番目の1$引数を参照しますが、他の引数でも明らかに実行できます。

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

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


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

于 2012-05-13T13:49:13.540 に答える
6

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

于 2012-05-13T13:56:29.353 に答える