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 *
如下:
- CString str1 ="123";
- char *p =(LPSTR)(LPCSTR)str1;
但好像官方并不建议这么做,而建议采用下面这种方式:
- CString str1 ="123";
- char *t1 =str1.GetBuffer(str1.GetLength());
- str1.ReleaseBuffer();
- //do something with t1
网上也有人说是这样t1 =str1.GetBuffer(0);但其实我在实测时并没发现str1.GetBuffer(str1.GetLenth())与str.GetBuffer(0)返回值有啥区别,MSDN中相应说明如下:
- CString::GetBuffer
- LPTSTR GetBuffer( int nMinBufLength );
- throw( CMemoryException );
- Return Value
- An LPTSTR pointer to the object’s (null-terminated) character buffer.
- Parameters
- nMinBufLength
- The minimum size of the character buffer in characters. This value does not include space for a null terminator.
- Remarks
- 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.
- If you use the pointer returned by GetBuffer to change the string contents, you must call ReleaseBuffer before using any other CString member functions.
- 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.
- The buffer memory will be freed automatically when the CString object is destroyed.
- 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
- char *str ="aaaa"
- CString str1(str);
- //...
2.3 CString -->int
在宽字符字符模式下,这个非常简单:
- CString str1 ="123";
- int i =atoi(str1);
- //do something with i
2.4 int -->CString
- int i =100;
- CString str;
- str.Format("%d",i);
- //...
3 Unicode编码模式
3.1 CString -->char *
在这种情况下,上述所说的转化全是浮云,目前只发现可以用WideCharToMultiByte函数来实现.
如下 :
- CString str1 =_T("123");
- int len =WideCharToMultiByte(CP_ACP,0,str1,-1,NULL,0,NULL,NULL);
- char *ptxtTemp =new char[len +1];
- WideCharToMultiByte(CP_ACP,0,str1,-1,ptxtTemp,len,NULL,NULL );
- //...
- delete[] ptxtTemp;
3.2 char * -->CString
还是可以如下:
- char *p ="test";
- CString str(p);
- //...
3.3 CString -->int
在这种情况下atoi不再适用,其实可以用swscanf,如下:
- CString str2 =_T("100");
- int i;
- swscanf(str2,_T("%d"),&i);
3.4 int -->CString
这个其实最简单了,如下:
- int j =100;
- CString str3;
- str3.Format(_T("%d"),j);
4 结束
另外,有关ANSI与Unicode之间的转换及UTF-8与Unicode之间的转换可以参与下面这个链接:
http://www.cnblogs.com/gakusei/articles/1585211.html
CString与char *互转总结的更多相关文章
- CString和char互转,十六进制的BYTE转CString
CString转char: CString m_Readcard; char ReaderName[22]; strcpy((char*)&ReaderName,(LPCTSTR)m_Read ...
- 【转载】CString,string,char*之间的转换
本文转自 <> 这三种类型各有各的优点,比如CString比较灵活,是基于MFC常用的类型,安全性也最高,但可移植性最差.string是使用STL时必不可少的类型,所以是做工程时必须熟练掌 ...
- 2、CString与string借助char *互转
CString是MFC中的类,MFC前端界面中获得的字符串是CString类.标准C/C++库函数是不能直接对CString类型进行操作的. string是C++中的类. 安全性 CString &g ...
- CString转char * ,string
CString头文件#include <afx.h> string头文件#include <string.h> 1.CString转char * CString cstr; c ...
- Cstring转char、string、int等数据类型的方法(转载)
Cstring转char.string.int等数据类型的方法 (-- ::) 转载 标签: 杂谈 分类: VC CString 转char * CString cstr; char *p = (LP ...
- Unicode字符集下CString与char *转换 (解决中文乱码等)(转)
UniCode 下 CString 转 char* 的方法的文章有很多,但是大部分都是在互相转载,看了那么多资料,仍然没有解决乱码的问题,后来从一个论坛的一条回复里面找到了正确的方法,特此拿出来与大家 ...
- c++ string 与 char 互转 以及base64
c++ string 与 char 互转 很简单如下 ] = {'A','B','C','D','E'}; printf("%s\n",bts); //char to string ...
- CString,string,char*之间的转换(转)
这三种类型各有各的优点,比如CString比较灵活,是基于MFC常用的类型,安全性也最高,但可移植性最差.string是使用STL时必不可少的类型,所以是做工程时必须熟练掌握的:char*是从学习C语 ...
- CString 转 char*; wstring 转 string
1. CString 转 char* ); CString name; name.Format(_T("bookUC%d.txt"),m_ID); std::wstring _n ...
随机推荐
- MySQL STRAIGHT_JOIN
问题 最近在调试一条查询耗时5s多的sql语句,这条sql语句用到了多表关联(inner join),按时间字段排序(order by),时间字段上已经创建了索引(索引名IDX_published_a ...
- cf B. Dima and Text Messages
http://codeforces.com/contest/358/problem/B 先按照题意说的构造一个字符串s,然后与对比的字符串T比较,看看在字符串T中顺序查找有没有字符串S的所有字符,有输 ...
- [LeetCode 122] - 买入与卖出股票的最佳时机II(Best Time to Buy and Sell Stock II)
问题 假设你有一个数组,其中的第i个元素表示一只股票在第i天的价格. 设计一个算法找出最大的利润值.你可以进行任意多次的交易(即多次的卖出并买入一份股票).你不能在同一时间进行多次交易(即你必须在再次 ...
- Borland license information was found,but it is not valid for delphi.
The start Delphi7 come amiss: Borland license information was found,but it is not valid for delphi. ...
- SmartBusinessDevFramework架构设计-2:结构图示
架构设计一览图 下图表示了本架构的设计草稿. 接下来 ,我们将逐步细述,各个模块之间的松散耦合关系. 核心的实现原理.敬请关注.
- windows下的用户态调试的底层与上层实现
操作系统:windows XP 调试器通过CreateProcess传入带有DEBUG_PROCESS和DEBUG_ONLY_THIS_PROCESS的dwCreationFlags创建被调试进程.这 ...
- IT人大学生活之“做点正经事”
最近一直主抓部门的人事招聘工作:很多到手的简历,特别是毕业一年之内的同学的简历上面都会写到:在xxx餐饮公司实习,获得了与人交流的经验:在学生会组织了哪些文体活动:在大四参加了一些与软件开发不相关的一 ...
- WEB 移动网站 手机点击 打电话 发短信
原文地址: http://www.blesswe.com/portal.php?mod=view&aid=428 我们在手机浏览网页是希望用户看到手机号码点击就可以直接打电话或发短信,下面我们 ...
- zoj3802:easy 2048 again(状压dp)
zoj月赛的题目,非常不错的一个状压dp.. 题目大意是一个一维的2048游戏 只要有相邻的相同就会合并,合并之后会有奖励分数,总共n个,每个都可以取或者不取 问最终得到的最大值 数据范围n<= ...
- Mac下配置phpredis扩展
最近把开发环境从windows转到Mac下,所有的环境都要重新来配置.由于Mac是基于unix系统的不太熟悉,所以遇到了很多问题. 安装phpredis扩展: 首先,大家先下载phpredis的扩展包 ...