CString与char *互转总结

1 前言

今天在网上看论坛,发现大家对CString与Char *互转各说一词,其实我发现提问者所说的情况与回答问题的人完全不是同一情况,这里做一总结.

首先大家得清楚一件事,一般在网上提出问题的人大部分使用的都是VC,那么你就应该知道,在VC下编程,工程属性中有一属性Charecter Set属性,其值可以设置为Use Multi-Byte Charecter Set 和 Use Unicode Charecter Set 这两种选择,具默认情况下工程是采用了Use Unicode Charecter Set选项.如我使用的VS2010的工程属性中如下:

VC在处理CString类型字符时,在这两种不种选择的处理结果也是完全不一样的,而网上那么答复大都是针对假设提问者是使用了Use Mult-Byte Chracter Set的前提下,但大多提这个问题的人都是使用了后者的情况的人.

暂且将Use Mult-Byte Chracter Set称之为宽字节字符模式,而Use Unicode Charecter Set称之为Unicode编码模式.

2 宽字节字符模式

首先讨论一下宽字符字符模式下的CStirng与Char *之间的互转,在这种情况下互换很简单:

2.1 CString -->char *

如下:

[cpp] view plaincopy

  1. CString str1 ="123";
  2. char *p =(LPSTR)(LPCSTR)str1;

但好像官方并不建议这么做,而建议采用下面这种方式:

[cpp] view plaincopy

  1. CString str1 ="123";
  2. char *t1 =str1.GetBuffer(str1.GetLength());
  3. str1.ReleaseBuffer();
  4. //do something with t1

网上也有人说是这样t1 =str1.GetBuffer(0);但其实我在实测时并没发现str1.GetBuffer(str1.GetLenth())与str.GetBuffer(0)返回值有啥区别,MSDN中相应说明如下:

[plain] view plaincopy

  1. CString::GetBuffer
  2. LPTSTR GetBuffer( int nMinBufLength );
  3. throw( CMemoryException );
  4. Return Value
  5. An LPTSTR pointer to the object’s (null-terminated) character buffer.
  6. Parameters
  7. nMinBufLength
  8. The minimum size of the character buffer in characters. This value does not include space for a null terminator.
  9. Remarks
  10. Returns a pointer to the internal character buffer for the CString object. The returned LPTSTR is not const and thus allows direct modification of CString contents.
  11. If you use the pointer returned by GetBuffer to change the string contents, you must call ReleaseBuffer before using any other CString member functions.
  12. The address returned by GetBuffer may not be valid after the call to ReleaseBuffer since additional CString operations may cause the CString buffer to be reallocated. The buffer will not be reallocated if you do not change the length of the CString.
  13. The buffer memory will be freed automatically when the CString object is destroyed.
  14. Note that if you keep track of the string length yourself, you should not append the terminating null character. You must, however, specify the final string length when you release the buffer with ReleaseBuffer. If you do append a terminating null character, you should pass –1 for the length to ReleaseBuffer and ReleaseBuffer will perform a strlen on the buffer to determine its length.

由上可知,GetBuffer的参数nMinBufLength为最小缓冲区长度,但实际结果没啥区别...

2.2 char * -->CString

[cpp] view plaincopy

  1. char *str ="aaaa"
  2. CString str1(str);
  3. //...

2.3 CString -->int

在宽字符字符模式下,这个非常简单:

[cpp] view plaincopy

  1. CString str1 ="123";
  2. int i =atoi(str1);
  3. //do something with i

2.4 int -->CString

[cpp] view plaincopy

  1. int i =100;
  2. CString str;
  3. str.Format("%d",i);
  4. //...

3 Unicode编码模式

3.1 CString -->char *

在这种情况下,上述所说的转化全是浮云,目前只发现可以用WideCharToMultiByte函数来实现.

如下 :

[cpp] view plaincopy

  1. CString str1 =_T("123");
  2. int len =WideCharToMultiByte(CP_ACP,0,str1,-1,NULL,0,NULL,NULL);
  3. char *ptxtTemp =new char[len +1];
  4. WideCharToMultiByte(CP_ACP,0,str1,-1,ptxtTemp,len,NULL,NULL );
  5. //...
  6. delete[] ptxtTemp;

3.2 char * -->CString

还是可以如下:

[cpp] view plaincopy

  1. char *p ="test";
  2. CString str(p);
  3. //...

3.3 CString -->int

在这种情况下atoi不再适用,其实可以用swscanf,如下:

[cpp] view plaincopy

  1. CString str2 =_T("100");
  2. int i;
  3. swscanf(str2,_T("%d"),&i);

3.4 int -->CString

这个其实最简单了,如下:

[cpp] view plaincopy

  1. int j =100;
  2. CString str3;
  3. str3.Format(_T("%d"),j);

4 结束

另外,有关ANSI与Unicode之间的转换UTF-8与Unicode之间的转换可以参与下面这个链接:

http://www.cnblogs.com/gakusei/articles/1585211.html

时间: 2024-08-29 12:13:51

CString与char *互转总结的相关文章

CString和char互转

CString转char: CString m_Readcard; char ReaderName[22]; strcpy((char*)&ReaderName,(LPCTSTR)m_Readcard); char 转CString: CString m_Readcard; char ReaderName[22]; CString m_Readcard(ReaderList); 原文地址:https://www.cnblogs.com/Pond-ZZC/p/9172440.html

CString转char * ,string

CString头文件#include <afx.h> string头文件#include <string.h> 1.CString转char * CString cstr; char *p =(LPSTR)(LPCTSTR)cstr; 2.string转 CStringCString.format(”%s”, string.c_str()); 用c_str()确实比data()要好. 3.char转 CStringCString.format(”%s”, char*); 4.cha

[转]CString转char * ,string

――――――――――――――――――――― CString头文件#include <afx.h> string头文件#include <string.h> 1.CString转char * CString cstr; char *p =(LPSTR)(LPCTSTR)cstr; 2.string转 CStringCString.format(”%s”, string.c_str()); 用c_str()确实比data()要好. 3.char转 CStringCString.form

CString string char* 之间的转换

下面是MFC/C++/C中字符类型CString, int, string, char*之间的转换的说明与举例,经常用的东西,相信对于用C/C++的朋友,还是比较有用的 string,CString,char*之间的转化 int 转 CString: CString.Format("%d",int); ............................... string 转 CString  CString.format("%s", string.c_str

String,CString,TCHAR,char之间区别和联系

char是类型TCHAR也是!不过他可以通过是否定义了UNICODE宏来判断到底是char还是w_char; TCHAR是一种字符串类型,它让你在以MBCS和UNNICODE来build程序时可以使用同样的代码,不需要使用繁琐的宏定义来包含你的代码,而char代表ASCII的字符 #ifdef UNICODE   typedef wchar_t TCHAR;   #else   typedef char TCHAR;   #endif 所以用MBCS来build时,TCHAR是char,使用UN

CString, QString, char*之间的转换(包括VC编译开关)

传给未分配内存的const char* (LPCTSTR)指针. CString cstr(asdd); const char* ch = (LPCTSTR)cstr; ch指向的地址和cstr相同.但由于使用const保证ch不会修改,所以安全.2.传给未分配内存的指针. CString cstr = "ASDDSD"; char *ch = cstr.GetBuffer(cstr1.GetLength() + 1); cstr.ReleaseBuffer(); //修改ch指向的值

CString、char、int、string相互转化

相比于C#,C++的类型转换更为麻烦.下面列举几种主要的类型转换,当然转换的方法有很多,以下可能是最简单.有效的方式了,以后在工作和学习中再逐渐添加其他的类型转换. CString转char* CString file=GetFilePath()+"parameter.txt";    char* pszFileName=(LPSTR)(LPCTSTR)file; string转CString string str; CString ss = str.c_str(); int转CStr

CString转char数组

首先修改Unicode字符集为多字节字符集,如果不修改字符集使用下面的方法拷贝字符串会出现数据错误,选择项目->项目属 性(或直接按alt+F7)->配置属性,在右边找到"字符集",将"使用Unicode字符集"改为"使用多字节字符集".保存之后需要重新生成解决方案.用strcpy_s(char*, CString)将CString转化为char数组,因为用memcpy也会出现乱码尾巴. 应用举例:将获得的数字字符串转化为float性

【VS开发】CString 转为 char *方法大全

[VS开发]CString 转为 char *方法大全 标签(空格分隔): [VS开发] 方法1: CString strTemp; char szTemp[128]; strTemp = _T("abckdkfei"); memset( szTemp, 0, sizeof(szTemp) ); strcpy( szTemp, strTemp.GetBuffer(strTemp.GetLength())); 方法2: char * pchar; CString str="he