我有一个允许用户输入字符串的应用程序。然后我计算字符串并将字符数放在它旁边。当我想把它放在诸如以下的列中时,问题就出现了:
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 :(得分: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
会有任何令人惊讶的结果
数字输出可能跟随。)