VS2010 将CString转换成char* 或const char*

VS2010 将CString转换成char* 或const char*网上介绍了各种方法,令你眼花缭乱,
但很多方法其实在vs2010下是不凑效的,他们说的大部分方法都是在VC6.0下的转换。而在VS2010的Unicode默认编程环境下,
经过试了N回之后还是不成功之后,会令你心烦意乱。下面是网上列举的一些转换的方法:CString转char*,如:
char * a = (LPSTR)(LPCTSTR)name; //name类型为CString
char * a =s name.GetBuffer(name.GetLength());
第一种方法在VS2010下他们不会报错,你会发现你可能得不到预期的结果,具体原因不说,自己搜了,网上很多。
第二种方法会报错如: error C2440: “=”: 无法从“wchar_t *”转换为“char *”;所以还是失败了。
网上也没有好的简洁的方法,只有自己写函数了,一个通用的比较好的函数,是既能将Cstring转成char * 又能将其转换为const char *,
只需稍微修改即可
函数1:CString转换为char*

char* CStrToChar(CString strSrc)
{
#ifdef UNICODE
        DWORD dwNum = WideCharToMultiByte(CP_OEMCP, NULL, strSrc.GetBuffer(0), -1, NULL, 0, NULL, FALSE);
	char *psText;
	psText = new char[dwNum];
	if (!psText)
		delete []psText;
	WideCharToMultiByte(CP_OEMCP, NULL, strSrc.GetBuffer(0), -1, psText, dwNum, NULL, FALSE);
	return psText;
#else
	return (LPCTSRT)strSrc;
#endif
}

转换成const char * 的

const char* CStrToChar1(CString strSrc)
{
#ifdef UNICODE
	DWORD dwNum = WideCharToMultiByte(CP_OEMCP, NULL, strSrc.GetBuffer(0), -1, NULL, 0, NULL, FALSE);
	char *psText;
	psText = new char[dwNum];
	if (!psText)
		delete []psText;
	WideCharToMultiByte(CP_OEMCP, NULL, strSrc.GetBuffer(0), -1, psText, dwNum, NULL, FALSE);
	return (const char*)psText;
#else
	return (LPCTSRT)strSrc;
#endif
}
都是比较通用的,在强制转换不凑效的情况下,利用它们来转换还是很很有效的!!只是存在一些缺点。
存在缺点:因为返回的的是动态分配的数组,所以会有内存泄露的危险,
还需进一步改进!!!
可以直接作为函数参数将CString变量进行直接转换,但这样就不能在使用完之后对其占用的内存空间进行有效的释放,
可以这样使用:
int main()
{
    CString str = _T("WINDOWS7");
	char* pChar1 = CStrToChar(str);
	//pChar = str.GetBuffer(str.GetLength());  // 不能这样转
	//char* pChar3 = (LPCSTR)(LPCTSTR)str;     // 取值时出现问题
	cout << "pChar1 = " << pChar1 << endl;

	delete[] pChar1;  // 释放由CStrTuChar函数占用的内存
	return 0;
}

但不能这样用:

CString GetLine(char* lpData, int &ndx);
int main()
{
	CString str = _T("WINDOWS7");
	GetLine(CStrToChar(str), 7); // 这样做,由CStrCStrToChar分配的内存就无法释放了,所以内存泄漏了
	
	.........
	return 0;
}
正确的用法就是先将转换后的值赋给一个char *变量,在函数用完之后,释放由char* 变量指向的内存。
函数2:CString转换为char
int CStrToChar(char* pDest, CString&  pSource)
{
	size_t i;
	wchar_t* pawstr = NULL;
	pawstr =   pSource.GetBuffer(pSource.GetLength()+1);  // 先转换为宽字节
	//wcstombs(pDest, pawstr, pSource.GetLength()+1);     // 非安全版
	wcstombs_s(&i, pDest, pSource.GetLength()+1, pSource, pSource.GetLength()+1);  // 安全版
	return 0;
}

下面是用法:

#define BUFFER_SIZE 100
int main()
{
	CString str = _T("WINDOWS7");
	char ch[BUFFER_SIZE];
        char* pChar = ch;
	CStrToChar(pChar, str);
	cout <<"pChar =   "<< pChar << endl;

	return 0;
}

其实函数2更像是将CString变量转换为char变量,然后由char*变量指向char变量,所以,
缺点:指定字符数组大小BUFFER_SIZE,但其不用考虑内存泄露的问题,所以,
在CString变量不是很大的情况下,可以考虑。

你可能感兴趣的:(VC++初尝)