我正在尝试使用数值数据将表写入stdout。我想格式化,以便数字对齐如下:
1234 23
312 2314
12 123
我知道这个数字的最大长度是6个字符,有没有一种聪明的方法可以知道在数字之前需要输出多少空格,所以它看起来就像这样?
答案 0 :(得分:10)
printf
可能是最快的解决方案:
#include <cstdio>
int a[] = { 22, 52352, 532 };
for (unsigned int i = 0; i != 3; ++i)
{
std::printf("%6i %6i\n", a[i], a[i]);
}
打印:
22 22
52352 52352
532 532
使用艰难而详细的iostream命令序列可以实现类似的功能;如果您更喜欢“纯C ++”的味道,别人肯定会发布这样的答案。
更新:实际上,iostreams版本并没有那么糟糕。 (只要你不想要科学浮动格式或十六进制输出,就是这样。)这就是:
#include <iostreams>
#include <iomanip>
for (unsigned int i = 0; i != 3; ++i)
{
std::cout << std::setw(6) << a[i] << " " << std::setw(6) << a[i] << "\n";
}
答案 1 :(得分:4)
对于c,使用“%6d”指定打印,即
for (unsigned i = 0; i < ROWS(a); ++i) {
for (unsigned j = 0; j < COLS(a); ++j)
printf("%6d ", a[i][j]);
printf("\n");
}
对于c ++,
for (unsigned i = 0; i < ROWS(a); ++i) {
for (unsigned j = 0; j < COLS(a); ++j)
std::cout << a[i][j] << ' ';
std::cout << std::setw(6) << std::endl;
}
不要忘记#include <iomanip>
。
出于类型安全原因,强烈建议使用cout而不是printf。 如果我没记错的话,Boost有一个类型安全的替代printf,所以你可以使用 而不是你需要格式字符串,args形式。
答案 2 :(得分:1)
为了好玩:
#include <boost/spirit/include/karma.hpp>
namespace karma = boost::spirit::karma;
int main(int argc, const char *argv[])
{
std::vector<std::vector<int>> a =
{ { 1,2,3 },
{ 4,5,6 },
{ 7,8,9 },
{ 10,11,12 },
{ 13,14,15 }, };
std::cout << karma::format(
*karma::right_align(7, ' ') [ karma::int_ ] % '\n', a) << "\n";
return 0;
}
输出:
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15