您的位置:首页 > 编程语言 > C语言/C++

C++的一些基本数据类型转换

2010-07-04 19:58 916 查看
最近公司的新人总是问我关于C++类型转换的问题,回想起来,才开始学习C++对类型转换感到非常麻烦,我特此在这坐一个基本的整理,希望能给予帮助,错误,不完整之处,请不吝赐教。

1.string 2 int

(1) atoi

string str = "2010";
int i = atoi(str.c_str()); // i = 2010


(2) strtol, strtoul

string str = "2010";
int i = strtol(str.c_str(), NULL, 10);// strtoul 效果一样, i = 2010


2. int 2 string

(1) stringstream

int i = 2010;
stringstream stream;  // #include <sstream>
string str;
stream << i;
stream >> str;  // str = 2010
// 也可以这样写str = stream.str();


(2) sprintf

int i = 2010;
string str;
char c[5];   // 要设置大小
sprintf(c, "%d ", i);
str += c;    // str = 2010


3 程序中还遇到不同类型的相互转换,下面是转换的模板。

#include <iostream>
#include <string>
#include <sstream>
#include <stdlib.h>
using namespace std;
template<class T>
void ConvertFromString(T &value, const string &s)
{
stringstream ss(s);
ss >> value;
}
template<typename T>
string Convert2String(const T &value)
{
stringstream ss;
ss << value;
return ss.str();
}
int main()
{
string s = "2010.07";
int i = 0;
ConvertFromString(i, s); // i = 2010
double d = 0.0;
ConvertFromString(d, s); // d = 2010.07 只能到小数点后2位
cout << d << endl;
double n = 2010.07;
string str;
str = Convert2String(n); // str = 2010.07 只能到小数点后2位
return 0;
}


4 在MFC中,CString 的转换

(1)与 string 的转换

CString strMFC = _T("MFC");
std::string strSTL = "STL";
// CString->std::string
strSTL = strMFC.GetBuffer(0);
// unicode情形下:
CStringW strW = _T("MFC_W");
CStringA strA(strW.GetBuffer(0));
strW.ReleaseBuffer();
strSTL = strA.GetBuffer(0);
strA.ReleaseBuffer();
//std::string->CString   例子:
CString strMFC;
std::string strSTL = "STL";
strMFC = strSTL.c_str();


(2)Format.把int ,double 转换成CString

int i = 2010;
double d = 2010.2011;
BYTE bt = 0x0A;
CString str;
str.Format(_T("%d"), i);	// str = 2010
str.Format(_T("%f"), d);	// str = 2010.2010
str.Format(_T("%02X"), bt);	// str = 0A


(3)把CString 转换成 int, double

// 在Unicode下:
CString str = _T("2010.07");
int i = _tstoi(str);       // i = 2010
double b = _tstof(str);    // b = 2010.07
// 非Unicode下:
CString str = _T("2010");
int i = strtol(str, NULL ,10);  // i = 2010


(4)与char* 转换

///char* 2 cstring
CString str;
char* c = "2010.07";
str.Format("%s", c); //str = c;
///cstring 2 char *
c = str.GetBuffer(str.GetLength());


(5) stringstream 转换模版

#include <string>
#include <sstream>
using namespace std;
template<typename T>		// typename:我感觉这样写要容易理解点,但是可能带来移植后不能编译
void ConverFormCString(T &value , const CString &s)
{
// Unicode
CStringW strW(s);
CStringA strA(strW.GetBuffer(0));
strW.ReleaseBuffer();
string str = strA.GetBuffer(0);
strA.ReleaseBuffer();
// 非 Unicode, 可以简单使用
// string str = s.GetBuffer(0);
stringstream ss(str);
ss >> value;
}
template<typename T>
CString Convert2CString(const T &value)
{
stringstream ss;
ss << value;
CString str;
str  =  ss.str().c_str(); // 先stringstream->string,然后string->CString
return str;
}
int main()
{
// 可用于大数的转换
// UINT64:无法支持负数
// 0 ~ 18,446,744,073,709,551,615都可转换
UINT64 i = 1234567890123;
CString str = Convert2CString(i);	// str1 = 1234567890123
UINT64 j = 0;
ConverFormCString(j, str);
cout << j << endl;					// j = 1234567890123
return 0;
}


5.boost 转换

#include <boost/lexical_cast.hpp>
using namespace boost;
int i = lexical_cast<int>("2010");
double d = lexical_cast<double>( "2010.07");


以上代码在VS2005下编译通过,并运行正确!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: