0

ユーザーが文字列を入力できるようにするアプリケーションがあります。次に、文字列を数え、その横に文字数を置きます。問題は、次のような列に配置したいときに発生します。

This is a Sentence                      The Len is 18
This is Another Sentence                The Len is 24
A                                       The Len is 1

列のsetw()をどのように計算しますか?str.size()そしてそれから私はそれを正確に得ることができない何かそれは常にぐらついています。

4

3 に答える 3

1

この場合、ユーザーが入力した文字列の最大長は定義されておらず、変化する可能性があるため、自分の最大長を想定して、簡単な計算でスペースを設定できます。

入力した文字列が特定の制限を超えないと仮定した場合、lenghtCol_posによって次のように長さ列の位置を固定し、次のようにstwを計算できます。

int lenghtCol_pos = 15;

string str ("Test string");

cout<<str<<stw( lenghtCol_pos-str.size() )<<"The Len is "<<str.size()<<endl;

一方、ユーザーができるだけ多くの長い文字列を自由に追加できる場合は、すべての文字列を2D配列に格納してから、文字列の最大長を取得し、それに応じてsetw()を設定できます。

于 2012-10-25T06:58:16.620 に答える
1

最初にcalcmaxword lengthが必要であり、次に出力テキストをmaxlengthに揃える必要があります。何かのようなもの

int align = maxWordSize - curWord.size();
for(int i = 0; i < align; i++)cout << " ";

それとも私は何かを誤解しましたか?

于 2012-10-25T05:29:46.247 に答える
0

このようなものを整列させるには、最初にすべての文字列をメモリ内、おそらく。内に収集する必要がありますstd::vector<std::string>std::max_element次に、次のような比較関数を使用して、最長のものを見つけるために使用できます 。

struct CompareSize
{
    bool operator()( std::string const& lhs, std::string const& rhs ) const
    {
        return lhs.size() < rhs.size();
    }
};

その後、adjustfield出力ストリームのフォーマットパラメータを設定std::setwし、文字列を反復処理するときに使用して、それぞれを次のように出力できます。

size_t longest = std::max_element( data.begin(), data.end(), CompareSize() )->size();
std::cout.setf( std::ios_base::left, std::ios_base::adjustfield );
for ( std::vector<std::string>::const_iterator current = data.begin(), end = data.end();
        current != end;
        ++ current ) {
    std::cout << std::setw( longest ) << *current
              << " The length is "
              << current->size()
              << std::endl;

(もちろん、実際のコードでは、フラグの初期値を保存し、ループの終了後に復元する必要があります。そうしないと、に変更すると、adjustfield後続の数値出力に多少驚くべき結果が生じます。)

于 2012-10-25T07:57:04.010 に答える