web-dev-qa-db-ja.com

出力で同じ長さを取得するためにprintf()を使用して文字列をフォーマットする方法は?

2つの関数があり、1つはStarting initialization...のようなメッセージを生成し、もう1つは戻りコードをチェックして"Ok""Warning"、または"Error"を出力します。ただし、生成される出力の長さは異なります。

Starting initialization...Ok.
Checking init scripts...Ok.

どうすればこのようなものを入手できますか:

Starting initialization...       Ok.
Checking init scripts...         Ok.
80
psihodelia

文字列フィールドで幅を指定できます。

printf("%-20s", "initialization...");

そして、そのフィールドで印刷されたものはすべて、指定した幅まで空白が埋め込まれます。

-は、そのフィールドのテキストを左揃えにします。

139
Carl Smotricz

printfは、幅指定子を使用したフォーマットを許可します。例えば.


printf( "%-30s %s\n", "Starting initialization...", "Ok." );

デフォルトでは右揃えが使用されるため、負の幅指定子を使用して左揃えを示します。

21
PP.

さらに、widthを選択する柔軟性が必要な場合は、次の2つの形式のいずれかを選択できます(切り捨てありまたはなし)。

int width = 30;
//no truncation uses %-*s
printf( "%-*s %s\n", width, "Starting initialization...", "Ok." );
// output is "Starting initialization...     Ok."

//truncated to the specified width uses %-.*s
printf( "%-.*s %s\n", width, "Starting initialization...", "Ok." ); 
// output is "Starting initialization... Ok."
16
lifebalance

特定の状況で役立つ%n修飾子もあります。文字列がこれまでにあった列を返します。例:テーブルのように最初の行の幅内にあるいくつかの行を書きたいとします。

int width1, width2;
int values[6][2];
printf("|%s%n|%s%n|\n", header1, &width1, header2, &width2);

for(i=0; i<6; i++)
   printf("|%*d|%*d|\n", width1, values[i][0], width2, values[i][1]);

2つの文字列header1header2が持つ可能性がある長さの同じ幅の2列を印刷します。すべての実装に%nがあるかどうかはわかりませんが、SolarisとLinuxにはあります。

12

また、手作業でスペースを追加してカウントし、メッセージを揃えるというかなりローテクなソリューションもあります。メッセージ文字列に末尾のスペースを含めることを妨げるものは何もありません。

1
Carl Smotricz