【问题标题】:Perfect Column Equation C++完美列方程 C++
【发布时间】:2012-10-25 05:27:57
【问题描述】:

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

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

如何计算列的 setw()? str.size() 然后是其他一些我无法完全正确的东西,它总是摇摆不定。

【问题讨论】:

  • 找到最大尺寸值并使用它 + 10 个符号有什么问题?
  • 不确定您的意思 - 但如果我在原始字符串中仅添加 10 个符号,它将被关闭
  • 输入后是否准确打印单词?或者用户输入,比如 10 个单词,然后打印出来
  • 我将它们打印下来。输入更多,然后我在最后打印输出,但我想打印得漂亮整洁。
  • 只是检查一下,既然你在谈论“wobbley”,你确定你使用的是等宽字体的控制台吗? :)

标签: c++ string multiple-columns output


【解决方案1】:

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

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

还是我误会了什么?

【讨论】:

  • 这行得通——但没有其他像 printf 或 setw 的。我的意思是可行,但它是最有效的吗?
  • 在 stl - 没有。如果您可以使用 boost - Boost.Format 具有列对齐功能。 新的格式化功能:'absolute tabulations',在循环内部很有用,以确保字段从一行到下一行打印在同一位置,即使前面的参数的宽度可能变化很大。
  • @kuperspb 这是一种艰难的做法。为什么不使用std::setw(在这里就像一个魅力)?
【解决方案2】:

在这种情况下,用户输入的字符串的最大长度没有定义,并且可以变化,因此您可以为自己假设最大长度,并可以通过简单的计算来设置空间。

如果我们假设我们输入的字符串不会超过某个限制,那么我们可以通过 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()。

【讨论】:

  • 什么是stw?二维数组从何而来:我只看到一个std::vector。任何其他选择都只是糟糕的编程。
【解决方案3】:

要对齐这样的东西,您首先必须收集所有字符串 在内存中,可能在std::vector&lt;std::string&gt; 中。然后你可以使用 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 在任何情况下都会产生令人惊讶的结果 可能会跟随的数字输出。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-05
    • 2013-07-04
    • 2011-06-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    相关资源
    最近更新 更多