今天遇到一个难题,以前一直都是从TCHAR *转换到CString,今天需要CString 转换成TCHAR *的方法,找了一下MSDN文档,没有发现有现成的函数可以用。后来上网搜索了一下,方法还不少。如下几种:
方法一,使用强制转换。例如:
CString theString( "This is a test" );
LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;
方法二,使用strcpy。例如:
CString theString( "This is a test" );
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
_tcscpy(lpsz, theString);
需要说明的是,strcpy(或可移值Unicode/MBCS的_tcscpy)的第二个参数是 const wchar_t* (Unicode)或const char* (ANSI),系统编译器将会自动对其进行转换。
方法三,使用CString::GetBuffer。例如:
CString s(_T("This is a test "));
LPTSTR p = s.GetBuffer();
// 在这里添加使用p的代码
if(p != NULL) *p = _T('\0');
s.ReleaseBuffer();
// 使用完后及时释放,以便能使用其它的CString成员函数
-------------------------------------------------------------------
我尝试了后面两种,都能成功,最后我还是选用了简单的第二种方法,因为采用第三种方法的话,需要用GetBuffer();函数,而该函数的使用需要非常的小心谨慎。
源码如下:
/**********
检查输入的手机型号是否合法。规定手机型号以CoolPad_开始。合法则返回TRUE,否则返回FALSE
***********/
BOOL CAutoBuildConfigDlg::CheckMobileName(CString strMobileName)
{
wchar_t * pdest;
CString strMobileName_temp;
strMobileName_temp = strMobileName;
TCHAR strCOOLPAD[] = L"COOLPAD_";
LPTSTR lpsz = new TCHAR[strMobileName_temp.GetLength()+1];
wcsncpy_s(lpsz,(strMobileName_temp.GetLength()+1),strMobileName_temp, (strMobileName_temp.GetLength()+1));
errno_t err;
err = _wcsupr_s(lpsz,strMobileName_temp.GetLength()+1);//因为没有找到不区分大小写的查找子字符串的函数,所以决定转换成大写然后进行比较。
pdest = wcsstr( lpsz,strCOOLPAD );
if( pdest != NULL )
{
return TRUE;
}
else
{
return FALSE;
}
}