#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);
これを行うためのより良い方法はありますか?
特別な形式の文字列を作成する必要はありません。 printf
を使用すると、フォーマットタグの精度として.*
を使用する場合、パラメーター(値に先行する)を使用して精度を指定できます。
例えば:
printf ("%d %.*s", number, SIZE, letters);
注:幅(最小フィールド幅)と精度(印刷される最大文字数を指定)には違いがあります。 %*s
は幅を指定し、%.s
は精度を指定します。 (また、%*.*
を使用することもできますが、2つのパラメーターが必要です。1つは幅用、1つは精度用です)
Printfのマニュアルページ(Linuxでは man 3 printf
)および特にフィールドの幅と精度に関するセクションも参照してください。
10進数の文字列の代わりに、「*」または「* m $」(一部の10進整数m)を記述して、それぞれ次の引数またはm番目の引数で精度を指定することを指定できます。タイプintの。
やや不明な関数は asprintf
です。最初のパラメーターは**char
。この関数は、文字列用にmalloc
スペースを使用するため、簿記を行う必要はありません。完了したら、文字列をfree
することを忘れないでください。
char *fmt_string;
asprintf(&fmt_string, "%%d %%%ds", SIZE);
printf(fmt_string, number, letters);
free(fmt_string);
使用例です。