0

I have an application that lets the user enter a string. I then count the string and put the number of characters next to it. The problem comes when I want put it in columns such as:

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

How would I calculate the setw() of the columns? str.size() and then something else I can't get it exactly right it's always wobbley.

4

3 回答 3

1

首先您需要计算最大字长,然后您需要将输出文本与最大长度对齐。就像是

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

还是我误解了什么?

于 2012-10-25T05:29:46.247 回答
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;

如果用户可以随意添加尽可能多的长字符串,那么我们可以将所有字符串存储在一个二维数组中,然后可以获得字符串的最大长度,并可以相应地设置 setw()。

于 2012-10-25T06:58:16.620 回答
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 回答