我正在重构一些遗留代码,这些代码使用printf
和长字符串(没有任何实际格式)来打印纯文本表格标题,概念上看起来像这样:
| Table | Column | Header |
现在是这样生产的:
printf("| Table | Column | Header |");
我想用代码生成上面的代码,其效果为1:
outputStream << "|" << std::setw(10) << std::center << "Table"
<< "|" << std::setw(10) << std::center << "Column"
<< "|" << std::setw(9) << std::center << "Header"
<< "|" << std::endl;
因为<iomanip>
有流操纵器std::left
、std::right
和std::internal
,但似乎没有任何std::center
,所以不能编译。在标准C++库中是否已经有一种干净的方法来完成此操作,或者我必须手动计算必要的间距?
1尽管这段代码比C代码更冗长,但从长远来看,由于printf
语句的数量和字符串中插入重复的数量,它不会太冗长,而且它还具有更好的可扩展性和可维护性。
6条答案
按热度按时间p1tboqfb1#
在C++20中,你可以使用
std::format
来完成这个任务:输出:
同时,您可以使用the {fmt} library,
std::format
基于。{fmt}还提供了print
函数,使此操作更加简单和高效(godbolt):免责声明:我是{fmt}和C++20
std::format
的作者。um6iljoc2#
下面是一个helper类,它可以完成您想要的任务:
调用
centered("String")
就可以使用它,如下所示:xdyibdwo3#
没有
std::center
操作器,恐怕你得自己动手了,你可以写一个helper函数来计算给定宽度和字符串的空格,以减少工作量。下面是一个helper函数的例子,它需要一些工作来使它更高效。
ctzwtxfj4#
恐怕你得手动操作了。但如果你使用字符串,这就不难了。比如:
应该可以。
7uzetpgm5#
这只适用于那些不需要对代码进行任何额外更改并且不包含任何新库的人,就像我一样。
上面给出的很多答案都需要新的helper类或额外的库,但是有一个简单的方法不需要任何额外的修改。你可以将宽度除以2,然后在要打印的元素的两侧添加setw()方法。作为问题的解决方案:
上面的代码将完成这项工作。
输出:
brtdzjyr6#
你可以使用NCURSES(#include<ncurses.h>)库...它有点时髦,你必须添加“-lncurses”到你的编译命令(gcc yourProgram.c/cpp -lncurses),它会工作,加上你可以做颜色和其他'酷'的东西(无论如何为CLI)。只要阅读手册,居中的东西是相当容易的。http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/