目錄
✅ 基本字符串格式化
✅ 按位置或名稱指定參數(可選)
✅ 格式化數字:進制、填充、對齊
✅ 浮點數控制精度
✅ 日期和時間格式化(需手動傳入結構)
✅ 自定義類型格式化(高級用法)
? 編譯要求
首頁 後端開發 C++ C std ::格式示例

C std ::格式示例

Sep 24, 2025 am 01:29 AM
c++

std::format 是C 20 引入的現代化格式化工具,1. 支持基本字符串格式化,如std::format("Hello, {}!", "World");2. 可按位置引用參數,如{0}、{1};3. 提供數字進制轉換({:#x}、{:#b})、填充({:06})和對齊({:>8});4. 控制浮點數精度({:.2f})和科學計數法({:.2e});5. 格式化時間需傳入std::tm,如{:%Y-%m-%d};6. 支持自定義類型,通過特化std::formatter 實現;7. 編譯需啟用C 20 並確保標準庫支持,推薦使用Clang 16 或MSVC。該庫類型安全且高效,取代printf 和stringstream,建議在新項目中使用。

C   std::format example

C 20 引入了std::format ,這是一個現代化、類型安全且高性能的格式化庫,取代了傳統的printfstringstream拼接方式。它使用類似於Python 的str.format()語法。

C   std::format example

下面是一些常見的std::format使用示例:


✅ 基本字符串格式化

#include <iostream>
#include <format>

int main() {
    std::string name = "Alice";
    int age = 30;

    std::string result = std::format("Hello, {}! You are {} years old.", name, age);
    std::cout << result << std::endl;
    // 輸出: Hello, Alice! You are 30 years old.
}

✅ 按位置或名稱指定參數(可選)

 std::string result = std::format("Name: {0}, Age: {1}, Again: {0}", "Bob", 25);
std::cout << result << std::endl;
// 輸出: Name: Bob, Age: 25, Again: Bob

// 或者使用命名參數(注意:std::format 不直接支持命名參數語法,但可以結合結構體/類使用)
// 但可以通過變量順序模擬邏輯上的“命名”

✅ 格式化數字:進制、填充、對齊

std::cout << std::format("Hex: {:#x}", 255) << std::endl; // hex with prefix: 0xff
std::cout << std::format("Bin: {:#b}", 255) << std::endl; // binary: 0b11111111
std::cout << std::format("Oct: {:#o}", 255) << std::endl; // octal: 0377

std::cout << std::format("Padded: {:06}", 42) << std::endl; // 000042
std::cout << std::format("Left-aligned: {:<8}", 42) << std::endl; // "42 "
std::cout << std::format("Centered: {:^8}", 42) << std::endl; // " 42 "
std::cout << std::format("Right-aligned: {:>8}", 42) << std::endl; // " 42"

✅ 浮點數控制精度

double pi = 3.14159265;

std::cout << std::format("Pi: {:.2f}", pi) << std::endl; // 保留兩位小數: 3.14
std::cout << std::format("Pi: {:.4f}", pi) << std::endl; // 3.1416
std::cout << std::format("Scientific: {:.2e}", pi) << std::endl; // 科學計數法: 3.14e 00

✅ 日期和時間格式化(需手動傳入結構)

雖然std::format支持時間類型(C 20 起),你可以這樣格式化時間:

C   std::format example
 #include <chrono>

auto now = std::chrono::system_clock::now();
std::time_t t = std::chrono::system_clock::to_time_t(now);
std::tm tm = *std::localtime(&t);

std::cout << std::format("Today: {:%Y-%m-%d %H:%M:%S}", tm) << std::endl;
// 輸出類似: Today: 2025-04-05 14:30:22

⚠️ 注意: std::formatstd::tm的支持需要編譯器完整實現<format>時區部分,Clang 16 / MSVC 支持較好,GCC 可能需要-std=c 20並啟用實驗支持。


✅ 自定義類型格式化(高級用法)

如果你有自定義結構體,可以為其特化std::formatter

C   std::format example
 struct Point {
    int x, y;
};

template<>
struct std::formatter<Point> {
    constexpr auto parse(auto& ctx) { return ctx.begin(); }

    auto format(const Point& p, auto& ctx) const {
        return std::format_to(ctx.out(), "({},{})", px, py);
    }
};

// 使用std::cout << std::format("Point: {}", Point{1, 2}) << std::endl;
// 輸出: Point: (1,2)

? 編譯要求

確保你使用的是支持C 20 的編譯器,並開啟C 20 模式:

  • Clang : clang -std=c 20 -fformat -O2 -Wall
  • GCC : g -std=c 20 -O2 -Wall (注意:GCC 13 對<format>支持較完整)
  • MSVC : Visual Studio 2022 應該支持良好

如果編譯報錯找不到<format> ,可能是標準庫實現不完整。可以考慮使用{fmt}庫( std::format的上游)作為替代。


基本上就這些常見用法。 std::format讓C 字符串處理變得更安全、簡潔,推薦在新項目中使用。

以上是C std ::格式示例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Stock Market GPT

Stock Market GPT

人工智慧支援投資研究,做出更明智的決策

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

如何編譯和運行C程序 如何編譯和運行C程序 Sep 16, 2025 am 05:29 AM

InstallaC compilerlikeg usingpackagemanagersordevelopmenttoolsdependingontheOS.2.WriteaC programandsaveitwitha.cppextension.3.Compiletheprogramusingg hello.cpp-ohellotogenerateanexecutable.4.Runtheexecutablewith./helloonLinux/macOSorhello.exeonWi

如何在C中執行系統命令 如何在C中執行系統命令 Sep 21, 2025 am 04:35 AM

使用std::system()函數可執行系統命令,需包含頭文件,傳入C風格字符串命令,如std::system("ls-l"),返回值為-1表示命令處理器不可用。

C自定義分配器示例 C自定義分配器示例 Sep 17, 2025 am 08:45 AM

自定義分配器可用於控制C 容器的內存分配行為,1.示例中的LoggingAllocator通過重載allocate、deallocate、construct和destroy方法實現內存操作日誌記錄;2.分配器需定義value_type和rebind模板,以滿足STL容器類型轉換需求;3.分配器構造與拷貝時觸發日誌輸出,便於追踪生命週期;4.實際應用包括內存池、共享內存、調試工具和嵌入式系統;5.C 17起construct和destroy可由std::allocator_traits默認處理

如何在C中實現自定義迭代器 如何在C中實現自定義迭代器 Sep 20, 2025 am 01:13 AM

答案是定義包含必要類型別名和操作的類。首先設置value_type、reference、pointer、difference_type和iterator_category,然後實現解引用、遞增及比較操作,最後在容器中提供begin()和end()方法以返回迭代器實例,使其兼容STL算法和範圍for循環。

為什麼實時系統需要確定性響應保障? 為什麼實時系統需要確定性響應保障? Sep 22, 2025 pm 04:03 PM

實時系統需確定性響應,因正確性依賴結果交付時間;硬實時系統要求嚴格截止期限,錯過將致災難,軟實時則允許偶爾延遲;非確定性因素如調度、中斷、緩存、內存管理等影響時序;構建方案包括選用RTOS、WCET分析、資源管理、硬件優化及嚴格測試。

C抽像類示例 C抽像類示例 Sep 15, 2025 am 05:55 AM

抽像類是包含至少一個純虛函數的類,不能被實例化,必須作為基類被繼承,且派生類需實現其所有純虛函數,否則仍為抽像類。 1.純虛函數通過virtual返回類型函數名()=0;聲明,用於定義接口規範;2.抽像類常用於統一接口設計,如area()、draw()等,實現多態調用;3.必須為抽像類提供虛析構函數(如virtual~Shape()=default;),確保通過基類指針正確釋放派生類對象;4.派生類繼承後需重寫純虛函數,如Rectangle和Circle分別實現area()計算各自面積;5.可通過

如何將整個文件讀取到C中的字符串中 如何將整個文件讀取到C中的字符串中 Sep 18, 2025 am 06:07 AM

使用std::ifstream和std::istreambuf_iterator可高效讀取文件全部內容到字符串,包括空格和換行,適用於中等大小文本文件。

如何在C中創建靜態變量 如何在C中創建靜態變量 Sep 19, 2025 am 05:24 AM

AstaticVariableInc witherinsitvaluebetwunctioncallsandisinitializedonce.2.Inideafunction,itpreservesstataTateAcrossCalls,siseascountingIterations.3.inaclass,itissharedamondamongallinStancessandMustancessandMustancessandMustbedIendEctIndEtheClastoAvoVovoiDlinkingErrors.4.StaticvariA.StaticvAriA.StaticVariA.StaticVariA

See all articles