如何将CString转换成const char*类型??
各位大侠,我在使用fopen函数时,它的第一个参数必须是const char*,而我自己获得的地址放在CString类型中,如何转换呢??
http://topic.eeworld.net/u/20071019/13/85c3b155-cd11-4cf5-97a7-27cdb69319c6.html
很多这样的帖子。LZ可以先自己找找
可以调用CString的GetBuffer方法后再转换,以前做过但记的不准…
int len = m_str.GetLength();
char *psendbuf = new char[len];
for(int i = 0; i < len;i++)
psendbuf = (char)m_str.GetAt(i);
可以通过函数转换,下面是两种方法的例子,需要注意的是使用eVC和VS2005可能会支持不同的转换方式,我没记错的话,下面的例子1应该可以用在eVC中,例子2可以用在VS2005中,希望这些对楼主有帮助。
1、
CString str = _T("Hello World!");
char szStr[256] = {0};
wcstombs(szStr, str, str.GetLength());
const char * p = szStr;
2、
CString IMSI=_T("888888888888888");
char *pBuffer1 = NULL;
pBuffer1 = new char[IMSI.GetLength()+1];
ZeroMemory(pBuffer1, IMSI.GetLength()+1);
USES_CONVERSION;
pBuffer1=(char*)W2A((LPCTSTR)IMSI);
使用pBuffer1后,delete[] pBuffer1;但是我调试的时候报错,显示内存崩溃,后来我不用new了,直接初始化一个char数组,示例如下:
char pBuffer1[16]={0};
USES_CONVERSION;
strcpy(pBuffer1,(char*)(W2A((LPCTSTR)registerPak.IMSI)));
CString是个好东西,有很多好用的成员函数,并且动态分配内存空间。但在MFC学习初期,容易把CString与const char*,char*混淆。遇到三种类型数据转换时,总是得过且过。下面就剖析一下三者之间的转换关系与方法。
CString与const char*(LPCTSTR---是在Unicode环境下const char*的宏定义)
CString类提供一个const char*()把CString类型转换为LPCTSTR类型。
比如AfxMessageBox()的使用,可以采用:
char szMessageText[] = "Unknown error";
AfxMessageBox(szMessageText);
也可以这样:
CString strMessageText("Unknown ;error");
AfxMessageBox(strMessageText);
CString类也提供了一个构造函式把LPCTSTR类型转换为CString类型。比如:
CString strTruth;
strTruth += " is alive";
引用: 引用 3 楼 cfanlwn 的回复:
int len = m_str.GetLength();
char *psendbuf = new char[len];
for(int i = 0; i < len;i++)
? ? ? psendbuf = (char)m_str.GetAt(i);
顶娜娜。
另外下面这篇文章也有必要读读
http://blog.eeworld.net/joyzml/archive/2010/01/14/5189472.aspx
转载P侠的。
嘎嘎
我们用的一个String转换到char*的函数:
void StringToChar(const CString s, char *Destination)
{
int k=0;
wchar_t *inf = NULL;
inf = new wchar_t[MAX_STRINGLENGTH];
wcscpy(inf,s);
k=WideCharToMultiByte(CP_ACP,0,inf,-1,NULL,0,NULL,0);
k=WideCharToMultiByte(CP_ACP,0,inf,k,Destination,k,NULL,0);
if(inf != NULL)
{
delete[]inf;
inf = NULL;
}
}
非常感谢大家的回复。我主要是uincode编码没弄明白。cfanlwn和gengzhen_2005的方法都可以用。我的程序是:
char* CADSAMPLEDlg::w2c(char* pcstr,const wchar_t* pwstr)
{
/*const wchar_t* pwstr;
pwstr=app->pathsave.GetBuffer(app->pathsave.GetLength());*/
pcstr = (char *)malloc(sizeof(char)*(2 * wcslen(pwstr)+1));
int nlength =wcslen(pwstr);
int nbytes = WideCharToMultiByte(0,0,pwstr,nlength,NULL,0,NULL,NULL);//为缓冲区分配空间,防止内存泄漏
WideCharToMultiByte(0,0,pwstr,nlength,pcstr,nbytes,NULL,NULL);
return pcstr;
}
做到是做出来了,可是存的时候转换的内容经常错误,比如应该是:aa.bmp,会转成aa.加几个小方框。
这应该也是转换错误吧???
上面那个app->pathsave是CString类型的,我先转为const wchar_t*,然后转成char*。
pwstr设为全局的,注释部分改在外部定义,内容不变。
引用: 引用 6 楼 garyliu1104 的回复:
我们用的一个String转换到char*的函数:
void StringToChar(const CString s, char *Destination)
{
int k=0;
wchar_t *inf = NULL;
inf = new wchar_t[MAX_STRINGLENGTH];
wcscpy(inf,s);
k=WideCharToMultiByte(CP_ACP,0,inf,-1,NULL,0,NULL,0);?
k=WideCharToMultiByte(CP_ACP,0,inf,k,Destination,k,NULL,0);
if(inf != NULL)
{
delete[]inf;
inf = NULL;
}
}
参考你的程序,问题解决!!
在程序最后加上
if(pwstr!=NULL)
{
delete[]pwstr;
pwstr=NULL;
}
来避免空格出现。
这是大家帮忙的结果,呵呵,我散分了!