完美列方程C ++

时间:2012-10-25 05:27:57

标签: c++ string multiple-columns output

我有一个允许用户输入字符串的应用程序。然后我计算字符串并将字符数放在它旁边。当我想把它放在诸如以下的列中时,问题就出现了:

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

我如何计算列的setw()? str.size()然后别的东西我不能完全正确它总是摇摆不定。

3 个答案:

答案 0 :(得分:1)

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

这样的东西
int align = maxWordSize - curWord.size();
for(int i = 0; i < align; i++)cout << " ";

或者我误解了什么?

答案 1 :(得分: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()。 / p>

答案 2 :(得分: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会有任何令人惊讶的结果 数字输出可能跟随。)