編寫**時經常需要在數值(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 ...