65,211
社区成员
发帖
与我相关
我的任务
分享
class CTypeChange
{
public:
char *CStringToPchar(CString src,char *dst=NULL);
};
char *CTypeChange::CStringToPchar(CString src,char *dst)
{
wchar_t* wCharTmp = src.GetBuffer(src.GetLength()+1);
size_t len = wcslen(wCharTmp) + 1;
size_t convertedChars = 0;
dst=new char(len);
wcstombs_s(&convertedChars, dst, len, wCharTmp , _TRUNCATE);
return dst;
}CString src="当爱已成往事";
CString src1="abcdefg";
CStringToPchar(src); //错误,输出的是空白
CStringToPchar(src1);//正确,输出abcdefg
class CTypeChange
{
public:
//这里第一个参数应该用const CString&,避免对象拷贝
char *CStringToPchar(const CString& src,char *dst=NULL);
};
char *CTypeChange::CStringToPchar(const CString& src,char *dst)
{
//不知道为什么那么多人喜欢用GetBuffer,这里GetBuffer的目的
//是什么?!你后面所有的计算都不需要一个可写的wchar_t类型
//而且对于这样的函数你要避免假定它现在是Unicode编译模式,
//否则一旦你关闭unicode编译模式怎么办?
//wchar_t* wCharTmp = src.GetBuffer(src.GetLength()+1);
//直接使用GetLength效率要高很多,为什么需要重新计算length
size_t len = src.GetLength() +1;
//size_t len = wcslen(wCharTmp) + 1;
//size_t convertedChars = 0;
if(NULL == dst) {//注意,如果没有这个判断,你在参数列表中加dst就没有意义了
//dst=new char(len);
dst = new char [len];//注意小括号和中括号
};
//还是一样,避免假定这个编译模式是Unicode的,否则你代码太不自适应了
//wcstombs_s(&convertedChars, dst, len, wCharTmp , _TRUNCATE);
USES_CONVERSION;
strcpy(dst, T2A(str));
return dst;
}