在 C++ 中使用 setw Manipulator

Jinku Hu 2021年6月28日
在 C++ 中使用 setw Manipulator

這篇文章展示瞭如何在 C++ 中使用 setw 流操作器。

在 C++ 中使用 std::setw 函式修改下一個 I/O 操作的寬度

流操縱器是修改輸入/輸出格式的特殊物件,有時會生成一些動作。std::endl 函式可以說是輸出流中最常用的物件,它確實是一個流操縱器。它列印一個換行符並重新整理輸出緩衝區。

另一方面,std::setw 命令不會產生任何輸出。相反,它將下一個 I/O 的寬度設定為傳遞的整數引數。一些流操縱器使用引數;這些必須包含一個 <iomanip> 標題。以下示例演示了 setw 操縱器的基本輸出格式設定方案。setfill 機械手是 setw 的天然伴侶。前者對於使用給定的 char 引數修改填充字元很有用。

#include <sstream>
#include <iostream>
#include <iomanip>

using std::cout; using std::setw;
using std::endl; 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 <sstream>
#include <iostream>
#include <iomanip>

using std::cout; using std::setw;
using std::endl; 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 <iostream>
#include <iomanip>

using std::cout; using std::setw;
using std::endl; using std::cin;

int main() {

    char buffer[24];
    cout << "username: ";
    cin >> setw(sizeof(buffer)) >> buffer;

    return EXIT_SUCCESS;
}

輸出:

username:
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn