编写一个库函数,自动插入适合特定输出宽度的前导空格和换行符是个好主意。本网站认为库推荐不属于讨论范围,但我在下面提供了一些代码 - 不是特别高效,但易于理解。基本逻辑应该是向前跳转到字符串中的最大宽度,然后向后移动,直到找到你准备断开行的空格(或可能是连字符)...然后打印前导空格和剩余部分的行。继续直到完成。
#include <iostream>
std::string fmt(size_t margin, size_t width, std::string text)
{
std::string result;
while (!text.empty())
{
result += std::string(margin, ' ');
if (width >= text.size())
return (result += text) += '\n';
size_t n = width - 1;
while (n > width / 2 && isalnum(text[n]) && isalnum(text[n - 1]))
--n;
(result += text.substr(0, n)) += '\n';
text.erase(0, n);
}
return result;
}
int main()
{
std::cout << fmt(5, 70,
"This is essentially what I do with large blocks of "
"descriptive text. It lets me see how long each of "
"the lines will be, but it's really a hassle, see?");
}
这部分代码尚未经过充分测试,但似乎能够工作。您可以在此处查看运行情况。如果需要其他替代方案,请参考这个SO问题。
顺便说一句,您的原始代码可以简化为...
cout << " This is essentially what I do with large blocks of\n"
" descriptive text. It lets me see how long each of\n"
" the lines will be, but it's really a hassle, see?\n";
...由于C++在遇到分号之前会认为语句未完成,因此在代码中相邻出现的双引号字符串字面量会自动连接在一起,就像内部的双引号和空格被删除一样。
setw()
,但我不认为它有效。或者你可以发一个例子来说明如何做到这一点吗? - Hammurabi8