我有一个让用户输入字符串的应用程序。然后我计算字符串并将字符数放在它旁边。问题来了,当我想把它在列如:完美的列公式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()然后是其他东西我不能完全正确它总是摇摆不定。
我有一个让用户输入字符串的应用程序。然后我计算字符串并将字符数放在它旁边。问题来了,当我想把它在列如:完美的列公式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()然后是其他东西我不能完全正确它总是摇摆不定。
首先,您需要计算最大字长,然后您需要将输出文本与最大长度对齐。 类似于
int align = maxWordSize - curWord.size();
for(int i = 0; i < align; i++)cout << " ";
还是我误解了一些东西?
这工作 - 但没有其他像printf或setw。我的意思是工作,但它是最有效的。 –
In stl - no。如果你可以使用boost - 有列对齐功能的Boost.Format。 _新的格式化功能:'绝对表格',有用的内部循环,以确保字段从一行到下一行打印在相同的位置,即使先前参数的窗口可能会有很大差异._ – kuperspb
@kuperspb这是以艰难的方式做事。为什么不使用'std :: setw'(在这里像一个魅力一样)? –
在这种情况下,用户输入的字符串的最大长度没有定义,并且可以改变,因此您可以假定自己的最大长度,并且可以通过简单的计算来设置空间。
如果我们假定我们输入的字符串将不超过一定限度,然后我们就可以定为长度列的位置由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'? 2D数组来自哪里:我只看到一个'std :: vector'。任何其他选择只是糟糕的编程。 –
要对齐这样的事情,首先必须收集内存中的所有字符串 ,可能是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
将在任何 数字输出可能会有一些令人惊讶的结果)。
找到最大大小值并使用它+ 10符号有什么问题? –
不确定你的意思 - 但是如果我只在原始字符串中添加10个符号,它将关闭 –
您是否在输入后准确地打印了单词?或者用户输入,比如说10个字,然后你打印它们 –