CString转char*的问题
最近在做C++与Matlab混编,在调用Matlab函数时需要传递参数,因此要把CString转char*,网上找到了getbuffer来做的方法,但是试过了,只得到了字符串的第一个字符,请问是什么原因?
char* mm;
CString ss;
ss=(".\\data\\chen-3s-2\\chen-3s-2_fea_realtime.mat");
mm=(char*)(ss.GetBuffer(ss.GetLength()));
ss.ReleaseBuffer();
//调试发现,mm只有一个'.'
//弹出框显示是正常的
MessageBox(ss.GetBuffer(ss.GetLength()));
//kk也是正常的,完整的字符串
char* kk=(".\\data\\chen-3s-2\\chen-3s-2_fea_realtime.mat");
CString转char*的问题 getbuffer
[解决办法]
你应该是用了UNICODE编码,每个字符都是双字节的,对于英文字符串来说,其UNICODE编码的第2个字节是0,所以你只能获取到第一个字母(因为接着就是0结尾了)。
所以char类型与wchar_t是不能直接强制转换的。具体还跟你程序选择的字符集有关系。解决办法有2种:
1.将你的工程改为本地多字符集就行。如果你是VC,一般在你工程项目属性的常规页面里面就有。
2.是在转换为char之前进行字符集转换。Windows下使用WideCharToMultiByte函数API就行。
如果不想跟底层API打交道,这里告诉你一个在VC中有效的UNICODE与本地多字节转换的诀窍:
那就是使用CStringW与CStringA。在VC的实现下,CString只是对前面两种类的重定义。更为重要的是前面两个类都有一个构造函数接收另外一个类型CString,其内部自动进行了字符集转换。
因此很简单了,转换代码如下:
CString str(_T("abcd")); //正常的CString,使用项目默认字符集,这里假设为UNICODE
CStringA strA(str);//使用CStringA,它有一个构造函数的实现自动将UNICODE编码转换为本地多字节码
const char* szBuf = (LPCSTR)strA;
//现在你可以使用szBuf了