int 轉(zhuǎn)化為 string
- 使用sprintf().[在C和C++中均可用]
// int sprintf( char *buffer, const char *format, [ argument] … );
// buffer:char型指針,指向?qū)⒁獙懭氲淖址木彌_區(qū)。
// format:格式化字符串。
// [argument]...:可選參數(shù),可以是任何類型的數(shù)據(jù)。
// 返回值:字符串長度(strlen)
int aa = 30;
char c[8];
int length = sprintf(c, "%05X", aa);
cout<<c<<endl;
- 使用stringstream
int aa = 30;
stringstream ss;
string s2;
ss<<aa;
ss>>s2;
cout<<s2<<endl; // 30
或者
s2 = ss.str();
cout<<s2<<endl; // 30
C++引入了ostringstream、istringstream、stringstream這三個類,要使用他們創(chuàng)建對象就必須包含#include <sstream>頭文件
string轉(zhuǎn)化為int
- 使用strtol(string to long)
string s = "17";
char* end;
int i = static_cast<int>(strtol(s.c_str(),&end,16));
cout<<i<<endl; // 23
i = static_cast<int>(strtol(s.c_str(),&end,10));
cout<<i<<endl; // 17
static_cast一般用來將枚舉類型轉(zhuǎn)換成整型或者整型轉(zhuǎn)換成浮點(diǎn)型。也可以用來將指向父類的指針轉(zhuǎn)換成指向子類的指針。
做這些轉(zhuǎn)換前,你必須確定要轉(zhuǎn)換的數(shù)據(jù)確實(shí)是目標(biāo)類型的數(shù)據(jù),因?yàn)閟tatic_cast不做運(yùn)行時的類型檢查以保證轉(zhuǎn)換的安全性。
也因此,static_cast不如dynamic_cast安全。
對含有二義性的指針,dynamic_cast會轉(zhuǎn)換失敗,而static_cast卻直接且粗暴地進(jìn)行轉(zhuǎn)換。這是非常危險的。例如:
class B {};
class D : public B {};
void f(B* pb, D* pd) {
D* pd2 = static_cast<D*>(pb); // Not safe, D can have fields and methods that are not in B.
B* pb2 = static_cast<B*>(pd); // Safe conversion, D always contains all of B.
}
- static_cast和dynamic_cast都可以用于類層次結(jié)構(gòu)中基類和子類之間指針或引用的轉(zhuǎn)換。所不同的是,static_cast僅僅是依靠類型轉(zhuǎn)換語句中提供的信息(尖括號中的類型)來進(jìn)行轉(zhuǎn)換;而dynamic_cast則會遍歷整個類的繼承體系進(jìn)行類型檢查。比如:
class B {
public:
virtual void Test(){}
};
class D : public B {};
void f(B* pb) {
D* pd1 = dynamic_cast<D*>(pb);
D* pd2 = static_cast<D*>(pb);
}
- 如果pb確實(shí)是指向一個D類型的對象,那pd1和pd2的值是相同的,即使pb為NULL。
- 如果pb實(shí)際指向的是一個B類型的對象,那dynamic_cast就會轉(zhuǎn)換失敗,并返回NULL(此時pd1為NULL);而static_cast卻依據(jù)程序員指定的類型簡單地返回一個指針指向假定的D類型的對象(此時pd2不為NULL),這當(dāng)然是錯誤的。
- 使用sscanf()
int i;
sscanf("17","%D",&i);
cout<<i<<endl; // 17
sscanf("17","%X",&i);
cout<<i<<endl; // 23
sscanf("0X17","%X",&i);
cout<<i<<endl; // 23
- 使用stringstream
string s = "17";
stringstream ss;
ss<<s;
int i;
ss>>i;
cout<<i<<endl; // 17
- 使用boost庫中的lexical_cast
string s = "17";
int i = boost::lexical_cast<int>(s);
cout<<i<<endl; // 17