2011-12-18 42 views
2

我想寫表與標準輸出的數值數據。我想這樣格式化號碼的排列:聰明的方式來格式化表格在標準輸出C

1234  23 
312 2314 
    12 123 

我知道一些最大長度爲6個字符,有沒有辦法知道有多少空間必須是數字之前輸出,所以它看起來一個聰明的辦法完全像這樣?

+7

看'的std :: setw'和''的std :: setfill''。 – moshbear 2011-12-18 00:11:32

+0

有沒有辦法使用?我知道這聽起來很奇怪,但是我想讓我的代碼儘可能便攜 – Blackie123 2011-12-18 00:16:21

+6

@ Blackie123:'iomanip'是一個C++標準庫附帶的頭文件 - 你找不到任何東西_more_ portable ... – ildjarn 2011-12-18 00:21:30

回答

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++」的味道,別人肯定會發布這樣的答案。


更新:實際上,輸入輸出流的版本是不是更可怕。 (只要你不想要的科學浮點格式或十六進制輸出,這是。)這裏有雲:

#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"; 
} 
+0

我並不關心「純C++」這麼多,但類型安全確實很好......; - ] – ildjarn 2011-12-18 00:16:02

+0

更多的人比'%i更熟悉'%d' '。 – moshbear 2011-12-18 00:16:48

+0

你是什麼意思的類型安全?這種方式看起來比使用其他庫好得多 – Blackie123 2011-12-18 00:18:15

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形式。

+4

不需要在每個*操作之前調用'setw'? – 2011-12-18 00:22:57

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