輸出對齊有兩個方面,一是輸出寬度,一是左對齊還是又對齊。
在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其實也是一樣的,優先保證把數據顯示完整。