我想寫表與標準輸出的數值數據。我想這樣格式化號碼的排列:聰明的方式來格式化表格在標準輸出C
1234 23
312 2314
12 123
我知道一些最大長度爲6個字符,有沒有辦法知道有多少空間必須是數字之前輸出,所以它看起來一個聰明的辦法完全像這樣?
我想寫表與標準輸出的數值數據。我想這樣格式化號碼的排列:聰明的方式來格式化表格在標準輸出C
1234 23
312 2314
12 123
我知道一些最大長度爲6個字符,有沒有辦法知道有多少空間必須是數字之前輸出,所以它看起來一個聰明的辦法完全像這樣?
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++」的味道,別人肯定會發布這樣的答案。
更新:實際上,輸入輸出流的版本是不是更可怕。 (只要你不想要的科學浮點格式或十六進制輸出,這是。)這裏有雲:
#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";
}
我並不關心「純C++」這麼多,但類型安全確實很好......; - ] – ildjarn 2011-12-18 00:16:02
更多的人比'%i更熟悉'%d' '。 – moshbear 2011-12-18 00:16:48
你是什麼意思的類型安全?這種方式看起來比使用其他庫好得多 – Blackie123 2011-12-18 00:18:15
對於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形式。
不需要在每個*操作之前調用'setw'? – 2011-12-18 00:22:57
爲了好玩:
#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
看'的std :: setw'和''的std :: setfill''。 –
moshbear
2011-12-18 00:11:32
有沒有辦法使用?我知道這聽起來很奇怪,但是我想讓我的代碼儘可能便攜 –
Blackie123
2011-12-18 00:16:21
@ Blackie123:'iomanip'是一個C++標準庫附帶的頭文件 - 你找不到任何東西_more_ portable ... – ildjarn 2011-12-18 00:21:30