C 字串格式化的C 實現

2021-08-08 04:08:43 字數 1743 閱讀 3680

概要

c#字串格式化的c++實現的步驟

原因

之所以做這個實現,是因為避免因為格式化導致的執行時錯誤

先做個簡化版的,支援,,等等,不支援大括號裡面的詳細格式化語法

第一步,收集格式化引數

定義乙個sargument的輕量級類,封裝各個基本型別的建構函式

如sargument(int);

sargument(const char*);

sargument(float);

sargument(double);

…(省略)

第二步,掃瞄解析

掃瞄並解析格式化字串中的模板

struct replacepoint的長度

}; 乙個結構體replacepoint表示出現的格式化的基本資訊,後續可以增加詳細的格式化資訊

最終得到replacepoint陣列

第三步,字串轉化

根據sargument的原始型別資訊以及replacepoint格式化資訊,將其轉化為字串

第四步,字串合併替換

針對每個replacepoint,將格式化字串中前面的原始內容拷貝

然後將其對應的sargument引數產生的字串拷貝

優點

1.型別資訊靜態捕捉:通過sargument的各種建構函式抓捕,是否支援,編譯時刻即可發現;

2.使用簡單:使用的時候不用關心格式化,也不用關心格式化是否錯誤

原生的sprintf系列函式,寫錯了,就是執行時錯誤.

3.多個繫結:可支援如,,同乙個引數可出現若干次

潛在的優點

這個模式,對**

全非同步的超高效能日誌:進入公司後就做的乙個日誌庫,類似log4j2,當初沒有c++版本,就考慮自己打造.沒有參考其設計,完全自己按照極速來設計(後續會寫這個方面的博文)

**非常友好

效能可以達到呼叫花費2-3us(微秒)

知識點:

如何為_vsnprintf_s_l定製化引數?

將每個引數前後銜接的放在一塊記憶體中,模擬呼叫棧的引數記憶體,然後將此位址作為最後乙個引數呼叫即可;

使用範例

char buf[128] = ;

int len=fmtbuf(buf, 「--,-」, 「hello world!」, 10.0f, 11.0f, 「45151515555555」);

最終buf內容如下:

「hello world!-10.000000-11.000000,11.000000-45151515555555」

len為57

效能對比

fmtbuf(buf, 「-,-」, 「hello world!」, 10.0f, 11.0f, 「45151515555555」);

_snprintf_s(buf, sizeof(buf), _truncate, 「%s-%f,%f-%s」, 「hello world!」, 10.0f, 11.0f, 「45151515555555」);

經過測試,非優化版,第乙個效能是第二個的2倍,優化版,第乙個是第二個的4倍

C 字串格式化

c 字串格式化 1 格式化識別符號 標準的數學格式字串用於返回通常使用的字串。它們通常象x0這樣的格式。x是格式化識別符號,0是精度識別符號。格式識別符號號共有9種,它們代表了大多數常用的數字格式。就像下表所示 字母含義 c或ccurrency 貨幣格式 d或ddecimal 十進位制格式 十進位制...

C 格式化字串

在c 程式開發中,我們會經常需要獲得某種格式化的字串,比如 顏色值 ff00ff,貨幣 2.00,日期2012 03 14等等。在c 中格式化字串,一般會用到string.format 和.tostring 兩個函式。1.已知顏色的rgb值,獲取顏色的字串格式 ff00ff。ff0ff string...

C 格式化字串

格式字串的形式為 輸出最小寬度 精度 長度 型別 例如,d格式符表示 用十進位制整形格式輸出。f表示用實型格式輸出,5.2f 格式表示輸出寬度為5 包括小數點 幷包含2位小數。函式概要 printf 函式用於列印格式化字串到標準輸出流。函式原型 include.int printf const ch...