请问如何将 CString类型的对象 转换为 char类型的?

解决方案 »

  1.   

    char*吧。
    CString string;
    char* p=(LPTSTR)(LPCTSTR)string;
      

  2.   

    he,he,he解决了吗?不过你要小心内存泄漏
      

  3.   

    已经有太多的人问了,实际上,CString本身就有自动转换的功能:
    CString::operator LPCTSTR
    operator LPCTSTR ( ) const;
    在该是char *的地方就会自动转换的,例如:char szBuff[100];
    CString str = "123456abc";
    strncpy( szBuff, str, strlen( str ) );
      

  4.   

    CString本来就可以用做char*,比如:
    CString str("50");
    int nConv = atoi( str );
    上面的语句实际上CString已经调用了LPCTSTR操作符进行了转换。
    如果要显示转换,还可以有:
    CString str("this is a test!");
    char* szBuf = str.GetBuffer( str.GetLenghth() );
    //......
    str.ReleaseBuffer();
      

  5.   

    楼上的用法有问题;
    CString str("50");---->CString str(_T("50"));否则在Windows2000下可能有问题;
    sans(sans):-------
    char szBuff[100];
    CString str = "123456abc";
    strncpy( szBuff, str, strlen( str ) );
    ------------------------------------------------
    jmcooler():
    CString str("this is a test!");
    char* szBuf = str.GetBuffer( str.GetLenghth() );
    //......
    str.ReleaseBuffer();
    ---------------------------------------------------------
    他们俩的方法较好,可以防止memeroy leak
      

  6.   

    sprintf(buffer,"%s",str.GetBuffer(str.GetLength());
      

  7.   

    char *pbuf;
    CString str("abc");
    char chArray[20];
    pbuf = (LPSTR)(LPCTSTR)str;
    CopyMemory(chArray,pbuf,str.Length());
      

  8.   

    jmcooler() 说得对!
    用CString.GetBufer()把CString变成字符数组,依指针对字符进行操作,
    做完后,一定要释放CString.ReleaseBuffer(),这种方法比较安全!
      

  9.   

    CString自定义的转换类型有LPCTSTR,要转换为LPTSTR,需要
    LPTSTR head = str.GetBufferSetLength(Str.GetLength());
                  str.ReleaseBuffer();
      

  10.   

    http://www.csdn.net/expert/topic/749/749795.xml?temp=.7058222                              关于CString总结前言:串操作是编程中最常用也最基本的操作之一. 做为VC程序员,无论是菜鸟或高手都曾用过CString.而且好像实际编程中很难离得开它(虽然它不是标准C++中的库).因为MFC中提供的这个类对我们操作字串实在太方便了,CString不仅提供各种丰富的操作函数、操作符重载,使我们使用起串起来更象basic中那样直观;而且它还提供了动态内存分配,使我们减少了多少字符串数组越界的隐患。但是,我们在使用过程中也体会到CString简直太容易出错了,而且有的不可捉摸。所以有许多高人站过来,建议抛弃它。
        在此,我个人认为:CString封装得确实很完美,它有许多优点,如“容易使用 ,功能强,动态分配内存,大量进行拷贝时它很能节省内存资源并且执行效率高,与标准C完全兼容,同时支持多字节与宽字节,由于有异常机制所以使用它安全方便” 其实,使用过程中之所以容易出错,那是因为我们对它了解得还不够,特别是它的实现机制。因为我们中的大多数人,在工作中并不爱那么深入地去看关于它的文档,何况它还是英文的。 
       由于前几天我在工作中遇到了一个本不是问题但却特别棘手、特别难解决而且莫名惊诧的问题。最后发现是由于CString引发的,后来,没办法,我把整个CString的实现全部看了一遍,才慌然大悟,并彻底弄清了问题的原因(这个问题,我已在csdn上开贴)。在此,我想把我的一些关于CString的知识总结一番,以供他(她)人借鉴,也许其中有我理解上的错误,望发现者能通知我,不胜感谢。1 CString实现的机制.
       CString是通过“引用”来管理串的,“引用”这个词我相信大家并不陌生,象Window内核对象、COM对象等都是通过引用来实现的。而CString也是通过这样的机制来管理分配的内存块。实际上CString对象只有一个指针成员变量,所以任何CString实例的长度只有4字节.
           即: int len = sizeof(CString);//len等于4
    这个指针指向一个相关的引用内存块,如图: CString str("abcd");
                                                ___
         ____________                          |   | 
        |            |                         |   | 
        | 0x04040404 |                         |   |  head部,为引用内存块相关信息
        |____________|                         |   |
             str                               |___|
                                               |'a'| 0x40404040
                                               |'b'|
                                               |'c'|
                                               |'d'|
                                               | 0 |正因为如此,一个这样的内存块可被多个CString所引用,例如下列代码:
    CString str("abcd");
    CString a = str;
    CString b(str);
    CString c;
    c = b;
    上面代码的结果是:上面四个对象(str,a,b,c)中的成员变量指针有相同的值,都为0x40404040.而这块内存块怎么知道有多少个CString引用它呢?同样,它也会记录一些信息。如被引用数,串长度,分配内存长度。
    这块引用内存块的结构定义如下:
    struct CStringData
    {
      long nRefs;       //表示有多少个CString 引用它. 4
      int nDataLength;  //串实际长度. 4
      int nAllocLength; //总共分配的内存长度(不计这头部的12字节). 4
    };
    由于有了这些信息,CString就能正确地分配、管理、释放引用内存块。
    如果你想在调试程序的时候获得这些信息。可以在Watch窗口键入下列表达式:
    (CStringData*)((CStringData*)(this->m_pchData)-1)或
    (CStringData*)((CStringData*)(str.m_pchData)-1)//str为指CString实例正因为采用了这样的好机制,使得CString在大量拷贝时,不仅效率高,而且分配内存少。
    2 LPCTSTR 与 GetBuffer(int nMinBufLength) 
    这两个函数提供了与标准C的兼容转换。在实际中使用频率很高,但却是最容易出错的地方。这两个函数实际上返回的都是指针,但它们有何区别呢?以及调用它们后,幕后是做了怎样的处理过程呢?
      (1) LPCTSTR 它的执行过程其实很简单,只是返回引用内存块的串地址。 它是作为操作符重载提供的,
          所以在代码中有时可以隐式转换,而有时却需强制转制。如:
              CString str;
              const char* p = (LPCTSTR)str;
              //假设有这样的一个函数,Test(const char* p);  你就可以这样调用
              Test(str);//这里会隐式转换为LPCTSTR
      (2) GetBuffer(int nMinBufLength) 它类似,也会返回一个指针,不过它有点差别,返回的是LPTSTR
      (3) 这两者到底有何不同呢?我想告诉大家,其本质上完全不一样,一般说LPCTSTR转换后只应该当常量使用,或者做函数的入参;而GetBuffer(...)取出指针后,可以通过这个指针来修改里面的内容,或者做函数的入参。为什么呢?也许经常有这样的代码:
            CString str("abcd");
            char* p = (char*)(const char*)str;
            p[2] = 'z';   
          其实,也许有这样的代码后,你的程序并没有错,而且程序也运行得挺好。但它却是非常危险的。再看
            CString str("abcd");
            CString test = str;
            ....
            char* p = (char*)(const char*)str;
            p[2] = 'z';   
            strcpy(p, "akfjaksjfakfakfakj");//这下完蛋了   
          你知道此时,test中的值是多少吗?答案是"abzd".它也跟着改变了,这不是你所期望发生的。但为什么会这样呢?你稍微想想就会明白,前面说过,因为CString是指向引用块的,str与test指向同一块地方,当你p[2]='z'后,当然test也会随着改变。所以用它做LPCTSTR做转换后,你只能去读这块数据,千万别去改变它的内容。
          
          假如我想直接通过指针去修改数据的话,那怎样办呢?就是用GetBuffer(...).看下述代码:
            CString str("abcd");
            CString test = str;
            ....
            char* p = str.GetBuffer(20);
            p[2] = 'z';  //   执行到此,现在test中值却仍是"abcd"
            strcpy(p, "akfjaksjfakfakfakj");   //    执行到此,现在test中值还是"abcd"
          为什么会这样?其实GetBuffer(20)调用时,它实际上另外建立了一块新内块存,并分配20字节长度的buffer,而原来的内存块引用计数也相应减1.  所以执行代码后str与test是指向了两块不同的地方,所以相安无事。
       (4) 不过这里还有一点注意事项:就是str.GetBuffer(20)后,str的分配长度为20,即指针p它所指向的buffer只有20字节长,给它赋值时,切不可超过,否则灾难离你不远了;如果指定长度小于原来串长度,如GetBuffer(1),实际上它会分配4个字节长度(即原来串长度);另外,当调用GetBuffer(...)后并改变其内容,一定要记得调用ReleaseBuffer(),这个函数会根据串内容来更新引用内存块的头部信息。
       (5) 最后还有一注意事项,看下述代码:
          char* p = NULL;
          const char* q = NULL;
          {
              CString str = "abcd";
              q = (LPCTSTR)str;
              p = str.GetBuffer(20);
              AfxMessageBox(q);// 合法的
              strcpy(p, "this is test");//合法的,
          }
          AfxMessageBox(q);// 非法的,可能完蛋
          strcpy(p, "this is test");//非法的,可能完蛋
          这里要说的就是,当返回这些指针后, 如果CString对象生命结束,这些指针也相应无效。
      

  11.   

    http://www.csdn.net/expert/topic/749/749810.xml?temp=.5922205