几个CString转换的问题,这个问题折磨了我两天的,以下代码是我参考网上给出的n种方法,居然没有一个可以的,看来我的vs2008进步了很多!
char *p_list = NULL;
char *p_ins = NULL;
char *p_temp =NULL;
char tlist[100];
CString s("This is a test"); //way1: CString to char*
p_list = (LPTSTR)(LPCTSTR)s;
//VS2008 compile error: 无法从“LPTSTR”转换为“char *”//way2: CString to char*
p_temp= s.GetBuffer(0);
strcpy(p_list,p_temp);//CString->char*
s.ReleaseBuffer(-1);
//VS2008 compile error: 无法从“wchar_t *”转换为“char *”//way2: CString to char*
p_temp= s.GetBuffer(s.GetLength());
strcpy(p_list,p_temp);//CString->char*
s.ReleaseBuffer();
//VS2008 compile error: 无法从“wchar_t *”转换为“char *”//way3:
p_list = (char*)s;
//error:无法从“CString”转换为“char *”//way4:
p_list= new char[s.GetLength()+1];
strcpy(p_list,(LPCSTR)s);
//error:无法从“CString”转换为“LPCSTR”//CString to char[]
strcpy(tlist,(char *)(const char*)s);
//VS2008 compile error: 无法从“CString”转换为“const char *”
char *p_list = NULL;
char *p_ins = NULL;
char *p_temp =NULL;
char tlist[100];
CString s("This is a test"); //way1: CString to char*
p_list = (LPTSTR)(LPCTSTR)s;
//VS2008 compile error: 无法从“LPTSTR”转换为“char *”//way2: CString to char*
p_temp= s.GetBuffer(0);
strcpy(p_list,p_temp);//CString->char*
s.ReleaseBuffer(-1);
//VS2008 compile error: 无法从“wchar_t *”转换为“char *”//way2: CString to char*
p_temp= s.GetBuffer(s.GetLength());
strcpy(p_list,p_temp);//CString->char*
s.ReleaseBuffer();
//VS2008 compile error: 无法从“wchar_t *”转换为“char *”//way3:
p_list = (char*)s;
//error:无法从“CString”转换为“char *”//way4:
p_list= new char[s.GetLength()+1];
strcpy(p_list,(LPCSTR)s);
//error:无法从“CString”转换为“LPCSTR”//CString to char[]
strcpy(tlist,(char *)(const char*)s);
//VS2008 compile error: 无法从“CString”转换为“const char *”
或者
TCHAR *str = s.GetBuffer(s.GetLength());
在做开发的时候,我们要选择字符集,既是使用unicode,还是使用多字节
//CString to char[]
strcpy(tlist,(char *)(const char*)s);
//VS2008 compile error: 无法从“CString”转换为“const char *”又一种方法:
//way5:
sprintf(p_list,(LPCTSTR)s);
//error:不能将参数 2 从“LPCTSTR”转换为“const char *”
当然是转化成char*,然后再拷贝了//way5:
sprintf(p_list,(LPCTSTR)s); 有这样的用法吗?
得:
sprintf(p_list, "%s", s.GetBuffer(s.GetLength()));
s.ReleaseBuffer();
前几天我也做这个了,然后就用这玩意解决的,挺好 楼主给两分吧,不要太多,哈哈
我的配置管理器显示是选择使用 Unicode 字符集;
不知道在程序中怎么重新设定字符集,设置好了后这些代码是不是不用改就能编译?
如果你不是unicode环境,
char* 不是用CString填进去的,应该是这样
CString szParA;
CString szParB;
假设接口是:
fun(char* ParA, char* parB);
那么应该写作:
fun(szParA.GetBuffer(0), szParB.GetBuffer(0);如果是unciode的编译环境
CString szParA;
CString szParB;假设接口是:
fun(char* ParA, char* parB);那么需要先转换为多字节字符串,然后才可以作为参数填写进去:
如果是wchar_t转换为char接口的可以用这个函数:
BOOL MyWideChar_tToMultiByte(LPTSTR lpcwszStr, LPSTR lpOut,INT nOutSize)
{
DWORD dwMinSize = 0;
dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE); if(dwMinSize > nOutSize)
{
return FALSE;
}
else
{
WideCharToMultiByte(CP_OEMCP,NULL,lpInt,-1,lpOut,nOutSize,NULL,FALSE);
return TRUE;
}
}所以两个参数需要这么转化:
char bufA[512];//多申请点,免得溢出
char bufB[512];MyWideChar_tToMultiByte(szParA.GetBuffer(0), bufA, sizeof(bufA));
MyWideChar_tToMultiByte(szParB.GetBuffer(0), bufB, sizeof(bufB));经过转换后,就可以作为char*类的替代品bufA、bufB作为参数填写进去了,如下:
fun(bufA, bufB);我举例了,你明白了吗?
char、wchar_t、CString,他们的单位字节数据是不同的,所对应的标准函数也是有区别的
如果,在复制问题上,想一概通吃,可以使用memcpy函数。
呵呵,具体的代码,就是用CString类的Insert函数了分多少没关系的,一分不给也还是要回。 我是带着满腔的热血,学习来的
添一点内容: 使用 Unicode 数据
Unicode 标准为全球商业领域中广泛使用的大部分字符定义了一个单一编码方案。所有的计算机都用单一的 Unicode 标准 Unicode 数据中的位模式一致地翻译成字符。这保证了同一个位模式在所有的计算机上总是转换成同一个字符。数据可以随意地从一个数据库或计算机传送到另一个数据库或计算机,而不用担心接收系统是否会错误地翻译位模式。
对于用一个字节编码每个字符的数据类型,存在的问题之一就是此数据类型只能表示 256 个不同的字符。这就迫使对于不同的字母表(例如相对较小的欧洲字母表)采用多重编码规格(或者代码页)。而且也不可能处理象日文汉字或韩国文字这样具有数千个字符的字母表。
mbstowcs 可以将char类型转换为宽字符类型
还没解决,郁闷啊!void CCaculatorADDDlg::OnBnClickedButtonequal()
{
// TODO: 在此添加控件通知处理程序代码
CString cNum1,cNum2,cNum3;//char应该改为什么合适?WCHAR,TCHAR
GetDlgItemText(IDC_EDIT1,cNum1);
GetDlgItemText(IDC_EDIT2,cNum2);
int f1 = atoi(cNum1);
int f2 = atoi(cNum2);
int f3 = f1 + f2;
itoa(f3,cNum3,10);
SetDlgItemText(IDC_EDIT3,cNum3);
}大家能帮忙看看吧!
CString str=_T("这是我的测试程序。");// 先得到要转换为字符的长度
const size_t strsize=(str.GetLength()+1)*2; // 宽字符的长度;
char * pstr= new char[strsize]; //分配空间;
size_t sz=0;
wcstombs_s(&sz,pstr,strsize,str,_TRUNCATE);
int n=atoi(const char*)pstr); // 字符串已经由原来的CString 转换成了 const char*//没有这番转换会报错,无法将LPCTSTR或CString 转换为const char*,每次转换都要写一堆上面的过程