29

最初に頭に浮かぶのは、たくさんの\tを実行することですが、単語が他の単語よりも数文字長い場合、単語の位置がずれてしまいます。

たとえば、次のようなものが必要です。

Name    Last Name            Middle initial
Bob     Jones                M
Joe     ReallyLongLastName   T

代わりに、cout ステートメントに "\t" のみを含めることで、取得することしかできません。

Name    Last Name            Middle initial
Bob     Jones                M
Joe     ReallyLongLastName                T

また

Name    Last Name            Middle initial
Bob     Jones    M
Joe     ReallyLongLastName   T

他に何をする必要がありますか?

編集:したがって、最初に表示する各列の最大幅を数え、それに応じてパディングスペースを追加する必要があることがわかります。しかし、どのように、どの機能を使用して、これを行うことができますか? 文字列内の文字数を単純に数えて、そこから移動する必要がありますか?

4

5 に答える 5

8

左揃えにはマイナスフラグでprintf()パディングを使用

 printf("%-8s%-21s%-7s%-6s\n", "Name", "Last Name", "Middle", "initial");
 printf("%-8s%-21s%-7s%-6s\n", "Bob", "Jones", "M", "");
 printf("%-8s%-21s%-7s%-6s\n", "Joe", "ReallyLongLastName", "T", "");

生成するもの:

Name    Last Name            Middle initial
Bob     Jones                M
Joe     ReallyLongLastName   T
于 2010-03-12T21:29:28.653 に答える
7

また、さまざまなエディター/ビューアーがさまざまなタブ幅でテキストを表示することも考慮する必要があります。そのため、タブを使用すると、あるビューアーではきれいに配置されたテキストが、別のビューアーでは見苦しく見える場合があります。

本当に素敵な配置を作成したい場合は、パディング スペースを使用できます。テキストに対して 2 つのパスを実行できます。最初に各列の最大幅を数え、次に適切な量のパディング スペースを各列に追加します。後者の場合は、オーダーメイドのprintf呼び出しを使用することもできます。

更新:列幅をカウントすることは、基本的に、特定の列にある文字列の長さをカウントすることを意味します。またはを使用しているかどうかに応じて、string::length()またはを使用して実行できます(前者をお勧めします)。次に、その列のすべての単語を繰り返し処理し、これまでの最大単語長を比較し、現在の単語が長い場合は、その長さを新しい最大長に設定します。単語を STL コンテナーに格納する場合は、アルゴリズムを使用して、1 回の関数呼び出しでジョブを実行することもできます。strlen()std::stringchar*std::max_element

于 2010-03-12T21:29:24.190 に答える
2

このような状況では、通常、2 つのパスが必要です。1 つは各列の最大幅を検出するため、もう 1 つは印刷を行うためです。標準の iostream の場合、このwidth()ルーチンを使用して、iostream にパディングを自動的に処理させることができます。

于 2010-03-12T21:30:58.560 に答える