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

StackOverflow https://stackoverflow.com/questions/1809399

  •  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 )を返し、メッセージを書きます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top