輸出對齊有兩個方面,一是輸出寬度,一是左對齊還是又對齊。
在C++里面,默認是右對齊,可以通過cout.setf(std::ios::left)調整為左對齊,而且這種調整是全局的
,一次設置,后面都有效。
但是對於輸出寬度的設置(使用cout.width(int i)設置)是一次性的,只影響緊隨其后的一次輸出。
具體可以參看下面的代碼:
#include<iostream>
int main(){
using std::cout;
cout.setf(std::ios::left);
int w = cout.width();
cout << "default field width = " << w << "\n";
cout.width(5);
cout << "N" << ":";
cout.width(8);
cout << "N * N" << "\n";
for (long i = 1; i <= 100; i *= 10){
cout.width(5);
cout << i << ':';
cout.width(8);
cout << i * i << "\n";
}
return 0;
}

我們可以把調整對齊方向的代碼刪除(也就是采用默認的右對齊設置),重新運行后輸出如下:

可以仔細觀察下,坐邊的數與冒號的距離。在采用右對齊的時候,左邊的數與冒號是緊鄰的,而采用左對齊的時候,左邊的數在輸出5個字符寬度后,才輸出冒號(再次強調,寬度設置只影響一次輸出。也就是只影響N的輸出,沒有影響冒號的輸出。)
在這方面C語言的就顯得簡單多了,printf("%5d"),輸出占用5個字符寬度,且右對齊,printf("%-5d")輸出占用5個字符寬度,且左對齊。都是什么時候用就什么時候設置。
還有一個問題就是,當實際的數據需要的寬度超出你設置的寬度的時候怎么辦?
C++的選擇是,保證將數據顯示完整。
比如上面程序中的第8行:
cout << "N" << ":";
我們修改成
cout << "NNNNN" << ":";
發現輸出如下:

此時,數據恰好5個字符寬,依舊可以對齊,但是我們再加一個N,如下:
cout << "NNNNNN" << ":";

有沒有發現已經對不齊了。所以C++中式優先保證把數據顯示完整。
C語言使用printf其實也是一樣的,優先保證把數據顯示完整。
