如何将CString转换成const char*类型??

87zhangmeng   2010-1-23 19:05 楼主
各位大侠,我在使用fopen函数时,它的第一个参数必须是const char*,而我自己获得的地址放在CString类型中,如何转换呢??

回复评论 (10)

http://topic.eeworld.net/u/20071019/13/85c3b155-cd11-4cf5-97a7-27cdb69319c6.html

很多这样的帖子。LZ可以先自己找找
点赞  2010-1-23 19:19
可以调用CString的GetBuffer方法后再转换,以前做过但记的不准…
点赞  2010-1-23 19:42
int len = m_str.GetLength();                                       
char *psendbuf = new char[len];

for(int i = 0; i < len;i++)
      psendbuf = (char)m_str.GetAt(i);               
点赞  2010-1-23 20:16
可以通过函数转换,下面是两种方法的例子,需要注意的是使用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";
点赞  2010-1-23 21:28
引用: 引用 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侠的。
嘎嘎
点赞  2010-1-23 22:25
我们用的一个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;
        }
}
点赞  2010-1-24 08:52
非常感谢大家的回复。我主要是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.加几个小方框。
这应该也是转换错误吧???
点赞  2010-1-24 09:04
上面那个app->pathsave是CString类型的,我先转为const wchar_t*,然后转成char*。
pwstr设为全局的,注释部分改在外部定义,内容不变。
点赞  2010-1-24 09:08
引用: 引用 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;
        }
来避免空格出现。
这是大家帮忙的结果,呵呵,我散分了!
点赞  2010-1-24 10:16
mark。会常用的
点赞  2010-1-25 17:29
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复