私はprintfと、通常のprintfを呼び出すmy_printf(...)と結果を特別な関数に送信するsprintfを書くというアイデアで遊んでいます。(ほとんどのプラットフォームでprintfと同じように動作するため、sprintfについて考えていました)。
私の考えは、これを行う小さなマクロを書くことでした:
#define my_printf(X, Y...) do{ printf(X, ## Y); \ char* data = malloc(strlen(X)*sizeof(char)); \ sprintf(データ, X, ## Y); \ other_print(データ);\ 無料 (データ);}ながら (0)
しかし、sprintf は文字列を X よりもはるかに大きなサイズに拡張できるため、このメソッドはほぼ直接壊れます。
そして、数値を追加するだけで、malloc は問題を攻撃するのに間違った方法のようです.
この問題に対処する方法について、より良いアイデアを持っている人はいますか? または、sprintf の結果がどのくらい大きくなるかをどうやって知ることができますか?
ありがとうヨハン
更新: printf が印刷する文字数を返すことを忘れていました。既にマクロで printf を呼び出しているため、数値を保存する int を追加するのは非常に簡単でした。
#define buf_printf(X, Y...) do{ int len = printf(X, ## Y); \ char* data = malloc((len+1)*sizeof(char)); \ sprintf(データ, X, ## Y); \ other_print(データ);\ 無料 (データ);}ながら (0)
更新:私はこれについて考えていましたが、おそらくエフェミエントが提案したものによく似た通常の関数を使用することは良い考えです. ここで鍵となるのは、さまざまな printf 関数 (vprintf、vsprintf、および vsnprintf) の v バージョンのようです。ご指摘ありがとうございます。
ありがとうヨハン