出力で同じ長さを取得するためにprintf()を使用して文字列をフォーマットする方法は?
-
05-07-2019 - |
質問
2つの関数があります。1つは Starting initialization ...
などのメッセージを生成し、もう1つは戻りコードをチェックして" Ok"
、"を出力します。警告"
または"エラー"
。ただし、生成される出力の長さは異なります。
Starting initialization...Ok.
Checking init scripts...Ok.
どうすればこのようなものを入手できますか:
Starting initialization... Ok.
Checking init scripts... Ok.
解決
文字列フィールドで幅を指定できます。
printf("%-20s", "initialization...");
そしてそのフィールドで印刷されたものはすべて、指定した幅まで空白が埋め込まれます。
-
は、そのフィールドのテキストを左揃えにします。
他のヒント
printf
では、幅指定子を使用した書式設定が可能です。例:
printf( "%-30s %s\n", "Starting initialization...", "Ok." );
デフォルトでは右揃えが使用されるため、負の幅指定子を使用して左揃えを示します。
さらに、 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."
特定の状況で役立つ%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つの文字列 header1
および header2
が持つ可能性がある長さの同じ幅の2列を印刷します。
すべての実装に%n
があるかどうかはわかりませんが、SolarisとLinuxにはあります。
また、手作業でスペースを追加してメッセージを整列させる、かなりローテクなソリューションもあります。メッセージ文字列に末尾のスペースを含めることを妨げるものは何もありません。
タブ、 \ t 文字修飾子の使用から始めます。固定された場所(列、ターミナル用語)に進みます。 ただし、列幅(正しく思い出せば4文字)以上の差がある場合は役に立ちません。
それを修正するには、「OK / NOK」を書きます。固定数のタブ(5?6 ?、試してみてください)を使用して、改行なしで( \ r )を返し、メッセージを書きます。