在 C++ 中使用 setw Manipulator
Jinku Hu
2023年10月12日
這篇文章展示瞭如何在 C++ 中使用 setw
流操作器。
在 C++ 中使用 std::setw
函式修改下一個 I/O 操作的寬度
流操縱器是修改輸入/輸出格式的特殊物件,有時會生成一些動作。std::endl
函式可以說是輸出流中最常用的物件,它確實是一個流操縱器。它列印一個換行符並重新整理輸出緩衝區。
另一方面,std::setw
命令不會產生任何輸出。相反,它將下一個 I/O 的寬度設定為傳遞的整數引數。一些流操縱器使用引數;這些必須包含一個 <iomanip>
標題。以下示例演示了 setw
操縱器的基本輸出格式設定方案。setfill
機械手是 setw
的天然伴侶。前者對於使用給定的 char
引數修改填充字元很有用。
#include <iomanip>
#include <iostream>
#include <sstream>
using std::cout;
using std::endl;
using std::setw;
using std::string;
int main() {
cout << "setw() : |" << 11 << "|" << endl
<< "setw(4): |" << setw(4) << 11 << "|" << endl
<< "setw(4): |" << 22 << setw(4) << std::setfill('-') << 22 << 33 << "|"
<< endl;
return EXIT_SUCCESS;
}
輸出:
setw() : |11|
setw(4): | 11|
setw(4): |22--2233|
或者,我們可以使用 setw
操作符來限制從 stringstream
物件中提取的字元數。此方法可能對宣告為固定陣列的 char
緩衝區有用。通常,操縱器是使用函式過載來實現的。
每個操縱器都是返回對流的引用的函式。指向這些函式之一的指標被傳遞給流提取/插入運算子,這些運算子本身就是過載運算子。引數函式是從過載運算子的主體中呼叫的。
#include <iomanip>
#include <iostream>
#include <sstream>
using std::cout;
using std::endl;
using std::setw;
using std::string;
int main() {
std::stringstream ss1("hello there");
char arr[10];
ss1 >> setw(6) >> arr;
cout << arr;
return EXIT_SUCCESS;
}
輸出:
hello
setw
操縱器的一個有用功能是輕鬆設定需要儲存在固定大小緩衝區中的使用者輸入的限制。我們只需要將 sizeof(buffer)
作為引數傳遞給 setw
。請注意,setw
呼叫會影響單個 I/O 操作,然後會自動恢復預設寬度。相反,setfill
修改保持活動狀態,直到顯式更改。
#include <iomanip>
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
using std::setw;
int main() {
char buffer[24];
cout << "username: ";
cin >> setw(sizeof(buffer)) >> buffer;
return EXIT_SUCCESS;
}
輸出:
username: