几个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 *”

解决方案 »

  1.   

    设置字符集
    或者
    TCHAR *str = s.GetBuffer(s.GetLength());
      

  2.   

    有没有更好的办法,我现在就想要CString->char*
      

  3.   

    设置字符集是最简单的方法了
    在做开发的时候,我们要选择字符集,既是使用unicode,还是使用多字节
      

  4.   

    还有一个是转char[]的问题也帮看看。
    //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 *”
      

  5.   

    //CString to char[] 
    当然是转化成char*,然后再拷贝了//way5:
    sprintf(p_list,(LPCTSTR)s);  有这样的用法吗?
    得:
    sprintf(p_list, "%s", s.GetBuffer(s.GetLength()));
    s.ReleaseBuffer();
      

  6.   

    用cstring的insert可以不?
     
        前几天我也做这个了,然后就用这玩意解决的,挺好   楼主给两分吧,不要太多,哈哈
      

  7.   

    非常感谢ouyh12345,
    我的配置管理器显示是选择使用 Unicode 字符集;
    不知道在程序中怎么重新设定字符集,设置好了后这些代码是不是不用改就能编译?
      

  8.   

    右键解决方案->属性->常规->使用多字节字符集
      

  9.   

    前面说了,设置字符集(不用UNICODE)是最简单的方法;如果在UNICODE下面,字符串就必须进行转换。当然,还有一种情况,就是用UNICODE版本的字符串函数。另外,也许不需要转化呢?比如完全按照字节(不是字符)处理的函数,直接把内存指针强制转换为char*就可以了。
      

  10.   


    如果你不是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);我举例了,你明白了吗?
      

  11.   

    p_list = (char*)(LPTSTR)(LPCTSTR)s
      

  12.   

    你在使用编程工具编写Code时,要注意其编译环境(这里主要是指对字符的配置)。
    char、wchar_t、CString,他们的单位字节数据是不同的,所对应的标准函数也是有区别的
    如果,在复制问题上,想一概通吃,可以使用memcpy函数。
      

  13.   


    呵呵,具体的代码,就是用CString类的Insert函数了分多少没关系的,一分不给也还是要回。     我是带着满腔的热血,学习来的
      

  14.   

    好贴,刚碰到此问题
    添一点内容:  使用   Unicode   数据   
      Unicode   标准为全球商业领域中广泛使用的大部分字符定义了一个单一编码方案。所有的计算机都用单一的   Unicode   标准   Unicode   数据中的位模式一致地翻译成字符。这保证了同一个位模式在所有的计算机上总是转换成同一个字符。数据可以随意地从一个数据库或计算机传送到另一个数据库或计算机,而不用担心接收系统是否会错误地翻译位模式。   
        
      对于用一个字节编码每个字符的数据类型,存在的问题之一就是此数据类型只能表示   256   个不同的字符。这就迫使对于不同的字母表(例如相对较小的欧洲字母表)采用多重编码规格(或者代码页)。而且也不可能处理象日文汉字或韩国文字这样具有数千个字符的字母表。   
        
      

  15.   

    wcstombs 可以将宽字符 转换为 char类型字符
    mbstowcs 可以将char类型转换为宽字符类型
      

  16.   

    我也碰到这个问题了,在VC++ 2005下CString转化成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);
    }大家能帮忙看看吧!
      

  17.   

    13楼正解,核心是用WideCharToMultiByte函数进行转换
      

  18.   

    这样也可以,我试过了
    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*,每次转换都要写一堆上面的过程