2010-12-08 22 views
0

これがconcatenateNULに適切な方法であるかどうかは、幅を含む文字列を終了させることです。文字列とsnprintfを連結して

#define FOO "foo" 
const char *bar = "bar"; 
int n = 10; 
float f = 10.2; 

char *s; 
int l; 

l = snprintf (NULL, 0, "%-6s %-10s %4d %4f",FOO, bar, n, f); 
s = malloc (l + 4); // should it be the number of formats tags? 
if (s == null) return 1; 
sprintf (s, "%-6s %-10s %4d %4f", FOO, bar, n, f); 
+0

メンテナンスの目的で、 'snprintf'と' sprintf'の両方で使用される1つのフォーマット文字列を定義することをお勧めします。それは1つの場所ではなく、他の場所で変更された場合は本当に吸うだろう! –

+0

これは良いアイデアのように思えますが、これに関連してサンプルコードを投稿することは可能でしょうか?ありがとう – Lucas

+1

'const char * fmt_str ="%-6s%-10s%4d%4f ";'のようなものを宣言し、両方の場所でフォーマット文字列として使用してください。 –

答えて

0

あなただけの唯一のヌルターミネータが追加さがあるので、snprintf()によって返された値に1を追加する必要があります。

ただし、l == -1snprintf()が失敗したことを示す)を確認する必要があります。

+0

'snprintf'は元のC89で定義されていないので、C99に準拠していない実装がいくつかあると思いますが、C99では' snprintf(NULL、...) 'がway OPはここでそれを使用します。 – ephemient

+0

@ephemient:まあまあ、私はそのビットを削除しました。 – caf

+0

ありがとう! – Lucas

1

いくつかのシステムでは、標準のCライブラリにある関数asprintfがあります。ここでは、allocateとsprintfがあります。