printfステートメントの読み取りに行き詰まったコードをいくつか実行しています。
printf("%*s%s\n", stat[type].dent, "", buf);
states[type].indent
は 4 に等しい数値でbuf
、文字列として 0 が格納された 215 バイトのバッファですが、確か""
で%*s
はなく、そのためのものです。
printf
この声明を読むのを手伝ってくれる人はいますか?
printfステートメントの読み取りに行き詰まったコードをいくつか実行しています。
printf("%*s%s\n", stat[type].dent, "", buf);
states[type].indent
は 4 に等しい数値でbuf
、文字列として 0 が格納された 215 バイトのバッファですが、確か""
で%*s
はなく、そのためのものです。
printf
この声明を読むのを手伝ってくれる人はいますか?
*
フォーマット コードの"%*s"
はprintf
、次の引数がフィールド幅であり、その後に通常の引数 (この場合は文字列) が続くことを示します。
たとえば、あなたの場合と同じ"%4s"
ですが、幅は実行時に設定できます。
これstat[type].dent
がフィールド幅で、空の文字列が文字列です。したがって、これは 4 文字幅の空の文字列を出力し (したがって 4 つのスペースを取得します)、その後にbuf
.
すべてが文書化されている場所に関する適切なリファレンスprintf
をお勧めします。
出力される引数の*
幅は、その前にある (整数) 引数に依存することを意味します。
cplusplusから:
printf ("Width trick: %*d \n", 5, 10); // 5 is the width, 10 is the integer being printed
は%*s
文字列変換です。この*
部分は、フィールドの幅がパラメーターとして提供されることを意味します (これstat[type].dent
が使用方法です)。そのため、指定された幅 (N と呼びます) で空の文字列を出力しています。つまり、出力する前に N 個の空白を残しますbuf
。
"%*s%s\n"
3 つのディレクティブを含む形式です。
"%*s"
このディレクティブは文字列変換仕様です。は、フォーマットの後の次のパラメータから*
フィールド幅 anを決定します。int
OPが言及しているように、これはからの4の値ですstat[type].dent
。次に、s
変換仕様は次のパラメーター ( ""
) を取得し、それを へのポインターとして扱いますchar *
。したがって、必要に応じて、最初にスペースを 4 つまで前にパディングして、 をprintf()
出力します。""
の文字列の長さ""
が 0 であるため、ここでは 4 つのパディング スペースが必要です。最終結果: 4 つのスペースが出力されます。
"%s"
このディレクティブも文字列変換仕様で、次のパラメータ を取り、buf
それが であると想定し、char *
その内容を出力します。OP がすべて0 であることを意味するかどうかは不明です。そうであれば、何も出力されません。
"\n"
この最後のディレクティブは単なるテキストなので、"\n"
出力されます。
*
数値である値に置き換えられstat[type].dent
、最小フィールド幅として知られます。
文字列変換の最大バイト数を指定する精度です。
アスタリスク (*) は、使用する値 (精度) を指定する整数引数を使用します。
可変長の文字列を出力するには、 を指定しますprintf("%*s", l, string)
。アスタリスクはl
に置き換えられます。