转:cc++数据类型转换1

    技术2026-08-29  5

    (float,char,string,CString)

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://mrcatart.blogbus.com/logs/68590681.html

    c/c++数据类型转换1(float,char,string,CString)

          Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。随着计算机工作能力的增强,Unicode也在面世以来的十多年里得到普及。 在非 Unicode 环境下,由于不同国家和地区采用的字符集不一致,很可能出现无法正常显示所有字符的情况。微软公司使用了代码页(Codepage)转换表的技术来过渡性的部分解决这一问题,即通过指定的转换表将非 Unicode 的字符编码转换为同一字符对应的系统内部使用的 Unicode 编码。

         int i = 100;           long l = 2001;           float f=300.2;           double d=12345.119;     char username[]="程佩君";           char temp[200];           char *buf;           CString str;    _variant_t v1;           _bstr_t v2;           wchar_t         wchar_t是C++的字符数据类型,char是8位字符类型,最多只能包含256种字符,许多外文字符集所含的字符数目超过256个,字符型无法表示。wchar_t数据类型为16位,所能表示的字符数远超char型。  标准C++中的wprintf()函数以及iostream类库中的类和对象能提供wchar_t宽字符类型的相关操作。例如:  #include <iostream>  using namespace std;  void main()  {  locale loc( "chs" );//定义“区域设置”为中文方式  wcout.imbue( loc );//载入中文字符输入方式  wchar_t str[]=L"中国";//定义宽字符数组,注意L是大写  wcout<<str<<endl;//显示宽字符数组,下同  wprintf(str);  system("pause");  }

    一、其它数据类型转换为字符串string1)短整型(int)itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制itoa(i,temp,2); ///按二进制方式转换 2)长整型(long)ltoa(l,temp,10); 3)浮点数(float,double)用fcvt可以完成转换,这是MSDN中的例子:int decimal, sign; char *buffer; double source = 3.1415926535; buffer = _fcvt( source, 7, &decimal, &sign ); 运行结果:source: 3.1415926535 buffer: '31415927' decimal: 1 sign: 0decimal表示小数点的位置,sign表示符号:0为正数,1为负数 4)CString变量str = "2008北京奥运";buf = (LPSTR)(LPCTSTR)str; 5)BSTR变量BSTR bstrValue = ::SysAllocString(L"程序员"); char * buf = _com_util::ConvertBSTRToString(bstrValue); SysFreeString(bstrValue); AfxMessageBox(buf); delete(buf); 6)CComBSTR变量CComBSTR bstrVar("test"); char *buf = _com_util::ConvertBSTRToString(bstrVar.m_str); AfxMessageBox(buf); delete(buf); 7)_bstr_t变量_bstr_t类型是对BSTR的封装,因为已经重载了=操作符,所以很容易使用_bstr_t bstrVar("test"); const char *buf = bstrVar;///不要修改buf中的内容 AfxMessageBox(buf);

    通用方法(针对非COM数据类型)用sprintf完成转换char buffer[200];char c = '1';int   i = 35;long j = 1000;float f = 1.7320534f;sprintf( buffer, "%c",c);sprintf( buffer, "%d",i);sprintf( buffer, "%d",j);sprintf( buffer, "%f",f);

    二、字符串string转换为其它数据类型temp="123456";1)短整型(int)i = atoi(temp); 2)长整型(long)l = atol(temp); 3)浮点(double)d = atof(temp); string s; d= atof(s.c_str()); 4)BSTR变量 BSTR bstrValue = ::SysAllocString(L"程序员"); ...///完成对bstrValue的使用SysFreeString(bstrValue); 5)CComBSTR变量CComBSTR类型变量可以直接赋值CComBSTR bstrVar1("test");CComBSTR bstrVar2(temp);6)_bstr_t变量_bstr_t类型的变量可以直接赋值_bstr_t bstrVar1("test"); _bstr_t bstrVar2(temp);

    7)string转char*

    string 是c++标准库里面其中一个,封装了对字符串的操作 把string转换为char* 有3中方法: 1。data 如: string str="abc"; char *p=str.data(); 2.c_str 如:string str="gdfd";     char *p=str.c_str(); 3 copy 比如 string str="hello"; char p[40]; str.copy(p,5,0); //这里5,代表复制几个字符,0代表复制的位置*(p+5)='/0'; //要手动加上结束符cout < <p;

    三、1. 其它数据类型转换到CString使用CString的成员函数Format来转换,例如:整数(int)           str.Format("%d",i); 浮点数(float)    str.Format("%f",i); doubledb = 777.999; str.Format("%.8f",db); 保留8位小数字符串指针(char *)可以直接赋值str = username; 对于Format所不支持的数据类型,可以通过上面所说的关于其它数据类型转化到char *的方法先转到char *,然后赋值给CString变量。注意:MFC智能设备string转Cstring   string s=”123456”;   CString cstr;   cstr=s.c_str();

       2.CString 转double或float

    (1)db = atof((LPCTSTR)str);

    (2)通过自定义函数实现

    void CStringToFloat(CString cstr ,double &f )//void CStringToFloat(CString cstr ,float&f ){int nLength = cstr.GetLength();int nBytes = WideCharToMultiByte(CP_ACP,0,cstr,nLength,NULL,0,NULL,NULL); char* pContentBuff = new char[ nBytes + 1];memset(pContentBuff,0,nBytes+1);WideCharToMultiByte(CP_OEMCP, 0, cstr, nLength, pContentBuff, nBytes, NULL, NULL);pContentBuff[nBytes] = 0; f = atof(pContentBuff);}

       3.CString转int

    CString如何转成int网上的介绍都是用atoi函数,但是CString 内部存储的是wchar_t 类型的字符,每个字符占两个字节,atoi的参数是char*,每个字符占一个字节 ,如果强制转换成char*,由于高位字节是空,所以就转成了只有第一个字符的串,这样是不对的.应该用_wtoi函数,这个函数的参数是wchar_t*,示例如下:CString str("123");int num = _wtoi(str);同样,也有_wtof(),_wtol()等函数可供将CString 转成不同的数值类型.

       4. 平台VC2005,使用Unicode字符集。CString类型转换为char*或char[ ]使用以前转换CString的方法或者网上别人的指导用法,都失效了(1.strcpy_s( pchar, sizeof(pchar), mCString.GetBuffer(mCString.GetLength()) );不行,mCString.GetBuffer()返回的是wchar_t数组,使用Unicode字符集时,wchar_t无法自动转换为char*.(2.strcpy_s(pchar, sizeof(pchar), (LPCSTR)_bstr_t(mCString));不行,"_bstr_t找不到识别符"(3.char *pch = (T2A)(LPSTR)(LPCTSTR)mCString; 也不行,"T2A是没声明的标识符",我补加上相应头文件AtlConv.h或AtlBase.h等的,也还是报错不改。(4.char *pch = (LPSTR)(LPCTSTR)mCString; 这样没有报错,但pch只能获得CString的第一个字符而已,第一个换成(char*),也只能获取第一个字符。(5.CString.GetBuffer(CString.GetLength())不行。w_char*不能转为_char*。

    用下面的函数wstring MultCHarToWideChar(string str){//获取缓冲区的大小,并申请空间,缓冲区大小是按字符计算的int len=MultiByteToWideChar(CP_ACP,0,str.c_str(),str.size(),NULL,0);TCHAR *buffer=new TCHAR[len+1];//多字节编码转换成宽字节编码MultiByteToWideChar(CP_ACP,0,str.c_str(),str.size(),buffer,len);buffer[len]='/0';//添加字符串结尾//删除缓冲区并返回值wstring return_value;return_value.append(buffer);delete []buffer;return return_value;}string WideCharToMultiChar(wstring str){string return_value;//获取缓冲区的大小,并申请空间,缓冲区大小是按字节计算的int len=WideCharToMultiByte(CP_ACP,0,str.c_str(),str.size(),NULL,0,NULL,NULL);char *buffer=new char[len+1];WideCharToMultiByte(CP_ACP,0,str.c_str(),str.size(),buffer,len,NULL,NULL);buffer[len]='/0';//删除缓冲区并返回值return_value.append(buffer);delete []buffer;return return_value;}于是使用string mstring = WideCharToMultiChar( (LPCTSTR)mCString );strcpy_s( pach, sizeof(pach), mstring.c_str() );转换成功!

     

    四、BSTR、_bstr_t与CComBSTRCComBSTR 是ATL对BSTR的封装,_bstr_t是C++对BSTR的封装,BSTR是32位指针,但并不直接指向字串的缓冲区。char *转换到BSTR可以这样: BSTR b=_com_util::ConvertStringToBSTR("数据");///使用前需要加上comutil.h和comsupp.libSysFreeString(bstrValue); 反之可以使用char *p=_com_util::ConvertBSTRToString(b);delete p;

    CComBSTR与_bstr_t对大量的操作符进行了重载,可以直接进行=,!=,==等操作,所以使用非常方便。

    五、VARIANT 、_variant_t 与 COleVariantVARIANT的结构可以参考头文件VC98/Include/OAIDL.H中关于结构体tagVARIANT的定义。对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:VARIANT va;int a=2001;va.vt=VT_I4;///指明整型数据va.lVal=a; ///赋值对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:Byte bVal; // VT_UI1. Short iVal; // VT_I2. long lVal; // VT_I4. float fltVal; // VT_R4. double dblVal; // VT_R8. VARIANT_BOOL boolVal; // VT_BOOL. SCODE scode; // VT_ERROR. CY cyVal; // VT_CY. DATE date; // VT_DATE. BSTR bstrVal; // VT_BSTR. DECIMAL FAR* pdecVal // VT_BYREF|VT_DECIMAL. IUnknown FAR* punkVal; // VT_UNKNOWN. IDispatch FAR* pdispVal; // VT_DISPATCH. SAFEARRAY FAR* parray; // VT_ARRAY|*. Byte FAR* pbVal; // VT_BYREF|VT_UI1. short FAR* piVal; // VT_BYREF|VT_I2. long FAR* plVal; // VT_BYREF|VT_I4. float FAR* pfltVal; // VT_BYREF|VT_R4. double FAR* pdblVal; // VT_BYREF|VT_R8. VARIANT_BOOL FAR* pboolVal; // VT_BYREF|VT_BOOL. SCODE FAR* pscode; // VT_BYREF|VT_ERROR. CY FAR* pcyVal; // VT_BYREF|VT_CY. DATE FAR* pdate; // VT_BYREF|VT_DATE. BSTR FAR* pbstrVal; // VT_BYREF|VT_BSTR. IUnknown FAR* FAR* ppunkVal; // VT_BYREF|VT_UNKNOWN. IDispatch FAR* FAR* ppdispVal; // VT_BYREF|VT_DISPATCH. SAFEARRAY FAR* FAR* pparray; // VT_ARRAY|*. VARIANT FAR* pvarVal; // VT_BYREF|VT_VARIANT. void FAR* byref; // Generic ByRef. char cVal; // VT_I1. unsigned short uiVal; // VT_UI2. unsigned long ulVal; // VT_UI4. int intVal; // VT_INT. unsigned int uintVal; // VT_UINT. char FAR * pcVal; // VT_BYREF|VT_I1. unsigned short FAR * puiVal; // VT_BYREF|VT_UI2. unsigned long FAR * pulVal; // VT_BYREF|VT_UI4. nt FAR * pintVal; // VT_BYREF|VT_INT. unsigned int FAR * puintVal; //VT_BYREF|VT_UINT. _variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。使用时需加上#include <comdef.h>例如:long l=222;ing i=100;_variant_t lVal(l);lVal = (long)i;COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:COleVariant v3 = "字符串", v4 = (long)1999;CString str =(BSTR)v3.pbstrVal;

     

    sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本。简单起见,我主要以stringstream为中心,因为每个转换都要涉及到输入和输出操作。示例1示范怎样使用一个stringstream对象进行从

    string到int类型的转换

    注意,<sstream>使用string对象来代替字符数组。这样可以避免缓冲区溢出的危险。而且,传入参数和目标对象的类型被自动推导出来,即使使用了不正确的格式化符也没有危险。

    示例1:

    std::stringstream stream;

    string result="10000";int n = 0;stream << result;stream >> n;//n等于10000

    int到string类型的转换

    string result;int n = 12345;stream << n;result =stream.str();// result等于"12345"

    重复利用stringstream对象

    如果你打算在多次转换中使用同一个stringstream对象,记住再每次转换前要使用clear()方法,在多次转换中重复使用同一个stringstream(而不是每次都创建一个新的对象)对象最大的好处在于效率。stringstream对象的构造和析构函数通常是非常耗费CPU时间的。经试验,单单使用clear()并不能清除stringstream对象的内容,仅仅是了该对象的状态,要重复使用同一个stringstream对象,需要使用str()重新初始化该对象。

    示例2:

    std::stringstream strsql;for (int i= 1; i < 10; ++i){ strsql << "insert into test_tab values(";   strsql << i << ","<< (i+10) << ");";   std::string str = strsql.str(); // 得到string   res = sqlite3_exec(pDB,str.c_str(),0,0, &errMsg);

       std::cout << strsql.str() << std::endl;

       strsql.clear();   strsql.str("");}

    最新回复(0)