CString、TCHAR*、char*转换 cstring与char *的转化(还包含很多种转换)

来源:互联网 发布:优易数据网站 编辑:程序博客网 时间:2024/05/24 03:20
stringbasicsystemdeletenulldate

 <1>CString 转化为 char*

[cpp] view plaincopyprint?
  1. CString strData = _T("ni hao");  
  2. int len = WideCharToMultiByte(CP_ACP, 0, strData, -1, NULL, 0, NULL, NULL);  
  3. char* szTarget = new char[len + 1];  
  4. memset(szTarget, 0, len + 1);  
  5. WideCharToMultiByte (CP_ACP, 0,strData, -1, szTarget, len, NULL,NULL);  
  6. delete[] szTarget;  
CString->TCHAR*的转化可以用函数GetBuff()
函数原型为:LPTSTR GetBuffer( int nMinBufLength );
[cpp] view plaincopyprint?
  1. CString str("CString");  
  2. TCHAR* szMsg = new TCHAR[100];  
  3. //其参数为CString字符串的长度   
  4. szMsg = str.GetBuffer(str.GetLength());  
  5. str.ReleaseBuffer();  
  6. delete []szMsg;  
  7. szMsg = NULL;  
TCHAR*->CString的转化
[cpp] view plaincopyprint?
  1. TCHAR szTchar[18] = L"TCHAR";    
  2. CString str;    
  3. str.Format(_T("%s"),szTchar);    
<2>
char 转换TCHAR未写
char*、TCHAR*转换CString
CString str(****)
下面详细写一下其它转换
[cpp] view plaincopyprint?
  1. /*  
  2. ***********************************************************************  
  3. * 函数: TransCStringToTCHAR  
  4. * 描述:将CString 转换为 TCHAR*  
  5. * 日期:2003-05-30 King  
  6. ***********************************************************************  
  7. */   
  8. TCHAR* CPublic::CString2TCHAR(CString &str)   
  9. {   
  10. int iLen = str.GetLength();   
  11. TCHAR* szRs = new TCHAR[iLen];   
  12. lstrcpy(szRs, str.GetBuffer(iLen));   
  13. str.ReleaseBuffer();   
  14. return szRs;   
  15. }   
  16. /*  
  17. ***********************************************************************  
  18. * 函数: THCAR2Char  
  19. * 描述:将TCHAR* 转换为 char*  
  20. * 日期:2003-05-30 King  
  21. ***********************************************************************  
  22. */   
  23. char* CPublic::THCAR2char(TCHAR* tchStr)   
  24. {   
  25. int iLen = 2*wcslen(tchStr);//CString,TCHAR汉字算一个字符,因此不用普通计算长度   
  26. char* chRtn = new char[iLen+1]   
  27. wcstombs(chRtn,tchStr,iLen+1);//转换成功返回为非负值   
  28. return chRtn;   
  29. }   
  30. /*  
  31. ***********************************************************************  
  32. * 函数: CString2char  
  33. * 描述:将CString转换为 char*  
  34. * 日期:2003-05-26 King  
  35. ***********************************************************************  
  36. */   
  37. char* CPublic::CString2char(CString &str)   
  38. {   
  39. int len = str.GetLength();   
  40. char* chRtn = (char*)malloc((len*2+1)*sizeof(char));//CString的长度中汉字算一个长度   
  41. memset(chRtn, 0, 2*len+1);   
  42. USES_CONVERSION;   
  43. strcpy((LPSTR)chRtn,OLE2A(str.LockBuffer()));   
  44. return chRtn;   
  45. }   
  46. //参考    
  47. ///////////////////////    
  48. //Pocket PC上的UNICODE和ANSI字符串    
  49. //By Vassili Philippov, September 26, 2001.   
  50. //杨方思歧 译    
  51. ////////////////////////    
  52. /*  
  53. ***********************************************************************  
  54. * 函 数 名:GetAnsiString  
  55. * 描 述:将CString(unicode)转换为char*(ANSI)  
  56. * 参 数:CString &s 要转换的CString  
  57. * 返 回 值:返回转换结果  
  58. * 日期、作者:创建日期:2003-5-30 King  
  59. * 最后修改:2003-5-30 King  
  60. ***********************************************************************  
  61. */   
  62. char* GetAnsiString(const CString &s)   
  63. {   
  64. int nSize = 2*s.GetLength();   
  65. char *pAnsiString = new char[nSize+1];   
  66. wcstombs(pAnsiString, s, nSize+1);   
  67. return pAnsiString;   
  68. }  
==========================================================================
evc vc字符串转换处理

1.头文件中要定义宏;  
      #define   UNICODE  
      #define   _UNICODE   
  ////////////////////

char   buf[128];  
  memset(buf,0,128);  
  strcpy(buf,"你好");  
  WCHAR   pCName[128];  
  memset(pCName,0,128);  
  MultiByteToWideChar(CP_THREAD_ACP,MB_USEGLYPHCHARS,buf,strlen(buf),pCName,128);   
   至于WCHAR   转换到CHAR,则用  
  WideCharToMultiByte

//////////////////////////


  2.char转换成wchar
  
      const   char   *pFilePathName   =   "c://aa.dll";  
      int   nLen   =   strlen(pFilePathName)   +   1;  
      int   nwLen   =   MultiByteToWideChar(CP_ACP,   0,   pFilePathName,  
nLen,   NULL,   0);  
   
      TCHAR   lpszFile[256];  
      MultiByteToWideChar(CP_ACP,   0,   pFilePathName,   nLen,   lpszFile,  
nwLen);  
   
  3.wchar转换成char  
        char   *pFilePathName;  
        TCHAR   lpszFile[256];  
      _tcscpy(lpszFile,   _T("c://aa.dll"));  
   
      int   nLen   =   wcslen(wstr)+1;    
      WideCharToMultiByte(CP_ACP,   0,   lpszFile,   nLen,   pFilePathName,  
2*nLen,   NULL,   NULL);
  

char*和CString转换
CString 是一种很特殊的 C++ 对象,它里面包含了三个值:一个指向某个数据缓冲区的指针、一个是该缓冲中有效的字符记数(它是不可存取的,是位于
CString 地址之下的一个隐藏区域)以及一个缓冲区长度。
有效字符数的大小可以是从0到该缓冲最大长度值减1之间的任何数(因为字符串结尾有一个NULL字符)。字符记数和缓冲区长度被巧妙隐藏。

(1) char*转换成CString
  若将char*转换成CString,除了直接赋值外,还可使用CString::Format进行。例如:
         char chArray[] = "Char  test";
         TCHAR * p = _T("Char  test");( 或LPTSTR p = _T("Char  test");)
         CString theString = chArray;
         theString.Format(_T("%s"), chArray);
         theString = p;

(2) CString转换成char*

  若将CString类转换成char*(LPSTR)类型,常常使用下列三种方法:

  方法一,使用强制转换。例如:

       CString theString( (_T("Char test "));
        LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;

  方法二,使用strcpy。例如:

       CString theString( (_T("Char test "));
       LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
        _tcscpy(lpsz, theString);

  需要说明的是,strcpy(或可移值的_tcscpy)的第二个参数是 const wchar_t* (Unicode)或const char*
(ANSI),系统编译器将会自动对其进行转换。

  方法三,使用CString::GetBuffer。
        如果你需要修改 CString 中的内容,它有一个特殊的方法可以使用,那就是 GetBuffer,它的作用是返回一个可写的缓冲指针。
如果你只是打算修改字符或者截短字符串,例如:
       CString s(_T("Char test "));
        LPTSTR p = s.GetBuffer();
        LPTSTR dot = strchr(p, ''.'');
         // 在这里添加使用p的代码
          if(p != NULL)
         *p = _T('/0');
         s.ReleaseBuffer();                     // 使用完后及时释放,以便能使用其它的CString成员函数
         在 GetBuffer 和 ReleaseBuffer 之间这个范围,一定不能使用你要操作的这个缓冲的 CString 对象的任何方法。因为
ReleaseBuffer 被调用之前,该 CString 对象的完整性得不到保障。

CString ,BSTR ,LPCTSTR之间关系和区别

CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指针。

                              CString 是一个完全独立的类,动态的TCHAR数组,封装了 + 等操作符和字符串操作方法。
                              typedef OLECHAR FAR* BSTR;
                              typedef const char * LPCTSTR;

                              vc++中各种字符串的表示法
                              首先char*
                              是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容。
                              LP的含义是长指针(long
                              pointer)。LPSTR是一个指向以‘/0’结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR。
                              而LPCSTR中增加的‘C’的含义是“CONSTANT”(常量),表明这种数据类型的实例不能被使用它的API函数改变,除此之外,它与LPSTR是等同的。
                              1.LP表示长指针,在win16下有长指针(LP)和短指针(P)的区别,而在win32下是没有区别的,都是32位.所以这里的LP和P是等价的.
                              2.C表示const
                              3.T是什么东西呢,我们知道TCHAR在采用Unicode方式编译时是wchar_t,在普通时编译成char.
                              为了满足程序代码国际化的需要,业界推出了Unicode标准,它提供了一种简单和一致的表达字符串的方法,所有字符中的字节都是16位的值,其数量也可以满足差不多世界上所有书面语言字符的编码需求,开发程序时使用Unicode(类型为wchar_t)是一种被鼓励的做法。
                              LPWSTR与LPCWSTR由此产生,它们的含义类似于LPSTR与LPCSTR,只是字符数据是16位的wchar_t而不是char。
                              然后为了实现两种编码的通用,提出了TCHAR的定义:
                              如果定义_UNICODE,声明如下:
                              typedef wchar_t TCHAR;
                              如果没有定义_UNICODE,则声明如下:
                              typedef char TCHAR;
                              LPTSTR和LPCTSTR中的含义就是每个字符是这样的TCHAR。
                              CString类中的字符就是被声明为TCHAR类型的,它提供了一个封装好的类供用户方便地使用。
                              LPCTSTR:
                                   #ifdef _UNICODE
                                      typedef const wchar_t * LPCTSTR;
                                   #else
                                      typedef const char * LPCTSTR;
                                   #endif
                              VC常用数据类型使用转换详解
                              
                              先定义一些常见类型变量借以说明
                              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;
                 一、其它数据类型转换为字符串
                              短整型(int)
                                     itoa(i,temp,10);    
                              //将i转换为字符串放入temp中,最后一个数字表示十进制
                                     itoa(i,temp,2);      //按二进制方式转换
                              长整型(long)
                                     ltoa(l,temp,10);

                 二、从其它包含字符串的变量中获取指向该字符串的指针
                              CString变量
                              str = "2008北京奥运";
                              buf = (LPSTR)(LPCTSTR)str;
                              BSTR类型的_variant_t变量
                              v1 = (_bstr_t)"程序员";
                              buf = _com_util::ConvertBSTRToString((_bstr_t)v1);
                 三、字符串转换为其它数据类型
                              strcpy(temp,"123");
                              短整型(int)
                                    i = atoi(temp);
                              长整型(long)
                                    l = atol(temp);
                              浮点(double)
                                    d = atof(temp);
                   四、其它数据类型转换到CString
                              使用CString的成员函数Format来转换,例如:
                              整数(int)
                                    str.Format("%d",i);
                              浮点数(float)
                                    str.Format("%f",i);
                              字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值
                                    str = username;
                      五、BSTR、_bstr_t与CComBSTR
                              CComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。
                              char *转换到BSTR可以这样: BSTR
                              b=_com_util::ConvertStringToBSTR("数据");    
                              //使用前需要加上头文件comutil.h
                              反之可以使用char *p=_com_util::ConvertBSTRToString(b);

                        六、VARIANT 、_variant_t 与 COleVariant
                              VARIANT的结构可以参考头文件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与常用数据的对应关系:
                              unsigned char 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
                              IUnknown FAR* punkVal;  VT_UNKNOWN
                              IDispatch FAR* pdispVal;  VT_DISPATCH
                              SAFEARRAY FAR* parray;  VT_ARRAY|*
                              unsigned char 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;  VT_BYREF
                              _variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
                              例如:
                              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;
                              long i = v4.lVal;

 

 

 

 

 

 

 

 

 

 

 

 

 

有点乱哈,时间比较紧,暂时先放着,有时间了会好好整理的!

CString 是一种很特殊的 C++ 对象,它里面包含了三个值:一个指向某个数据缓冲区的指针、一个是该缓冲中有效的字符记数(它是不可存取的,是位于 CString 地址之下的一个隐藏区域)以及一个缓冲区长度。 有效字符数的大小可以是从0到该缓冲最大长度值减1之间的任何数(因为字符串结尾有一个NULL字符)。字符记数和缓冲区长度被巧妙隐藏。

(1) char*转换成CString

  若将char*转换成CString,除了直接赋值外,还可使用CString::Format进行。例如:

         char chArray[] = "Char test";
        TCHAR * p = _T("Char test");( 或LPTSTR p = _T("Char test");)
         CString theString = chArray;
         theString.Format(_T("%s"), chArray);
         theString = p;

(2) CString转换成char*

  若将CString类转换成char*(LPSTR)类型,常常使用下列三种方法:

  方法一,使用强制转换。例如:

       CString theString( (_T("Char test "));
        LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;

  方法二,使用strcpy。例如:

       CString theString( (_T("Char test "));
       LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
        _tcscpy(lpsz, theString);

  需要说明的是,strcpy(或可移值的_tcscpy)的第二个参数是 const wchar_t* (Unicode)或const char* (ANSI),系统编译器将会自动对其进行转换。

  方法三,使用CString::GetBuffer。

        如果你需要修改 CString 中的内容,它有一个特殊的方法可以使用,那就是 GetBuffer,它的作用是返回一个可写的缓冲指针。 如果你只是打算修改字符或者截短字符串,例如:
       CString s(_T("Char test "));
        LPTSTR p = s.GetBuffer();

       LPTSTR dot = strchr(p, ''.'');

         // 在这里添加使用p的代码

         if(p != NULL)

        *p = _T('');
         s.ReleaseBuffer();                     // 使用完后及时释放,以便能使用其它的CString成员函数

        在 GetBuffer 和 ReleaseBuffer 之间这个范围,一定不能使用你要操作的这个缓冲的 CString 对象的任何方法。因为ReleaseBuffer被调用之前,该 CString 对象的完整性得不到保障。

----------------------------------------------------

其它数据类型转换为字符串

1。短整型(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: 0
decimal表示小数点的位置,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);


8。通用方法(针对非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);
(是转载)   

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 邻居不让养狗了怎么办 养狗地板有味道怎么办 狗狗嘴巴被大狗咬肿了怎么办 花了钱心里难受怎么办 狗在屋里有味道怎么办 养狗家里有异味怎么办 养狗房子有味道怎么办 狗身上有腥臭味怎么办 狗狗不想养了怎么办 药流2天后没出血怎么办 药流当天血多怎么办 怀孕四十天不想要怎么办 人流后出血量大怎么办 药流一直不出血怎么办 药流一直不见红怎么办 药流12天还流血怎么办? 把别人车刮了怎么办 车划掉漆了怎么办啊 倒车时碰了车怎么办 车头掉了一点漆怎么办 新买的车被刮了怎么办 白色车车头漆掉了一小块怎么办 临时牌照丢了1张怎么办 临牌遗失了一张怎么办 临牌只有一张了怎么办 临时牌丢了一个怎么办 药流出血特别多怎么办 新车刮擦了一点怎么办 自己的车撞墙了怎么办 新车被撞了个坑怎么办 车门被刮变形了怎么办 撞到别人的新车怎么办 新车掉了一点漆怎么办 新车擦了点漆怎么办 车挂了一点漆怎么办 第一天上班中途想走了怎么办 车子前脸裂开了怎么办 不想干了想辞职怎么办 药流期间老是吐怎么办 在工厂上班辞工后没发工资怎么办 培训期三天想走怎么办