2012-10-25 36 views
0

我有一个让用户输入字符串的应用程序。然后我计算字符串并将字符数放在它旁边。问题来了,当我想把它在列如:完美的列公式C++

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

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

+0

找到最大大小值并使用它+ 10符号有什么问题? –

+0

不确定你的意思 - 但是如果我只在原始字符串中添加10个符号,它将关闭 –

+0

您是否在输入后准确地打印了单词?或者用户输入,比如说10个字,然后你打印它们 –

回答

1

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

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

还是我误解了一些东西?

+0

这工作 - 但没有其他像printf或setw。我的意思是工作,但它是最有效的。 –

+0

In stl - no。如果你可以使用boost - 有列对齐功能的Boost.Format。 _新的格式化功能:'绝对表格',有用的内部循环,以确保字段从一行到下一行打印在相同的位置,即使先前参数的窗口可能会有很大差异._ – kuperspb

+0

@kuperspb这是以艰难的方式做事。为什么不使用'std :: setw'(在这里像一个魅力一样)? –

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()。

+0

什么是'stw'? 2D数组来自哪里:我只看到一个'std :: vector'。任何其他选择只是糟糕的编程。 –

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将在任何 数字输出可能会有一些令人惊讶的结果)。