web-dev-qa-db-ja.com

printf文字列、可変長アイテム

#define SIZE 9
int number=5;
char letters[SIZE]; /* this wont be null-terminated */
... 

char fmt_string[20];
sprintf(fmt_string, "%%d %%%ds", SIZE);
/* fmt_string = "%d %9d"... or it should be */

printf(fmt_string, number, letters);

これを行うためのより良い方法はありますか?

38

特別な形式の文字列を作成する必要はありません。 printfを使用すると、フォーマットタグの精度として.*を使用する場合、パラメーター(値に先行する)を使用して精度を指定できます。

例えば:

printf ("%d %.*s", number, SIZE, letters);

注:幅(最小フィールド幅)と精度(印刷される最大文字数を指定)には違いがあります。 %*sは幅を指定し、%.sは精度を指定します。 (また、%*.*を使用することもできますが、2つのパラメーターが必要です。1つは幅用、1つは精度用です)

Printfのマニュアルページ(Linuxでは man 3 printf )および特にフィールドの幅と精度に関するセクションも参照してください。

10進数の文字列の代わりに、「*」または「* m $」(一部の10進整数m)を記述して、それぞれ次の引数またはm番目の引数で精度を指定することを指定できます。タイプintの。

105
Trent

やや不明な関数は asprintf です。最初のパラメーターは**char。この関数は、文字列用にmallocスペースを使用するため、簿記を行う必要はありません。完了したら、文字列をfreeすることを忘れないでください。

char *fmt_string;

asprintf(&fmt_string, "%%d %%%ds", SIZE);
printf(fmt_string, number, letters);
free(fmt_string);

使用例です。