C 中數值 字串間的轉換

2021-04-20 05:46:57 字數 1924 閱讀 2173

編寫**時經常需要在數值(int, long, float, double ...)與字串間的相互轉換。c/c++中相關的轉換方法主要有如下幾種:

(一)、使用crt庫中的轉換函式族。

缺點:轉換函式較多,命名不統一以致難以記住,使用不方便。

(二)、借助c++98標準中的stringstream模板類實現。

數值到字串的轉換可如下實現:      

template

basic_stringnumeric2string(numerict num)

其中,chart型別可以是char或wchar_t,對應的返回型別分別是string和wstring。numerict型別除了可以是int, long, float等內建(build-in)數值類外型,還可以是過載了operator << 運算子的class型別。像這樣使用:
string str = numeric2string(10);

wstring wstr = numeric2string(10.1f);

同理,我們可以實現字串到數值的轉換:

template

numerict string2numeric(const basic_string&str)

為了支援c風格字串直接到數值的轉換,我們可以像這樣為其過載乙個轉換:

template

numerict string2numeric(const chart *str)

細心的讀者可能已經發現兩個string2numeric轉換**相同,為什麼還要過載呢?這是因為我們要借助basic_istringstream類模板,需要得到chart型別,假如我們這樣:

template 

numerict string2numeric(const stringt &str)

那怎麼生成basic_istringstream物件呢?若stringt是string或wstring,可以這樣basic_istringstream, 可還是不支援c字串。

此方法的優點:轉換函式少,容易記住,使用方便。

缺點:模板程式設計對於c++初學者來說有難度,需手工實現。

(三)、使用第三方庫。

例如boost中的lexical_cast模板:

string str = lexical_cast(10);

int i = lexical_cast("20");

早期的lexical_cast實現技術大致與(二)中的相似,借助string流、過載及模板機制。

使用此種方法的優點:功能強大且穩定,僅有唯一的轉換介面。

缺點:需學習研究方能使用。

(四)、使用sprintf、sscanf。

其函式原型為:

int sprintf(char *buffer, const

char *format [,argument] ...);

int swprintf(wchar_t *buffer, size_t count, const

wchar_t *format [, argument]...);

int sscanf(const

char *buffer, const

char *format [,argument ] ...);

int swscanf(const

wchar_t *buffer, const

wchar_t *format [,argument ] ...);

此種方法的最大弊端是陣列緩衝區容易益處,且無型別安全檢查。強烈不推薦使用。

(五)、其它未列出方法。

C 中數值 字串間的轉換

編寫 時經常需要在數值 int,long,float,double 與字串間的相互轉換。c c 中相關的轉換方法主要有如下幾種 一 使用crt庫中的轉換函式族。缺點 轉換函式較多,命名不統一以致難以記住,使用不方便。二 借助c 98標準中的stringstream模板類實現。數值到字串的轉換可如下實...

數值字串

加粗樣式 數值與字串 受限於電腦記憶體 數字 int float 布林none 列表list l 1,2,3 l 1 2 字典表dict d d.get name d name 元組t 1,2,3,4 元組與列表區別 列表可以改變相應下標資料,元組不行。數值 宣告賦值使用 表示式 佔位符.forma...

C 字串和數值間轉換

主要是用到字元流istringstream ostringstream的特性 string to double.the same way works for string to int.double string to double string s stoi方法 類似有stod方法 string ...