CString   str;
m_Inf.GetWindowText(str);
str=str.Right(1);
send(s,p,sizeof(char),0);//此处p是char *类型,
如何把CString str 转化为char * 类型呢。

解决方案 »

  1.   

    char* pBuf = str.GetBuffer(0);
      

  2.   

    char* sz = str.GetBuffer(str.GetLength());
      

  3.   

    可以直接强制类型转换 (LPTSTR)(LPCTSTR)str,即为char*类型
      

  4.   

    char* pBuf = str.GetAt(0);
      

  5.   

    char* p = str.GetAt(0);
      

  6.   

    “可以直接强制类型转换 (LPTSTR)(LPCTSTR)str,即为char*类型”我是用这个
      

  7.   

    char* sz = str.GetBuffer(str.GetLength());
    send(s,sz,sizeof(char),0);我这样写,还是 不行呀!error C2440: 'initializing' : cannot convert from 'unsigned short *' to 'char *'
      

  8.   

    send(s,sz,str.GetBuffer(0),0);str.GetBuffer(0)  //从str的内存起誓地址开始。。str.GetBuffer(str.GetLength()) 严重错误,没内存的概念。。哎。
      

  9.   

    str.GetBuffer(0)  //从str的内存起誓地址开始。。str.GetBuffer(str.GetLength()) 严重错误,没内存的概念。。哎。---------------------------------------
    GetBuffer是返回一个锁定的内存地址,参数是指要锁定的内存长度好好看看msdn
      

  10.   

    char* sz = str.GetBuffer(str.GetLength());
    send(s,sz,strlen(sz),0);这样就行了
      

  11.   

    楼上照你说的做了
    char* sz = str.GetBuffer(str.GetLength());
    报错:
    E:\WinsockClient\WinsockClientDlg.cpp(182) : error C2440: 'initializing' : cannot convert from 'unsigned short *' to 'char *'
      

  12.   

    CString 转 char *:
    CString str;
    int nLength=str.GetLength();
    char * sz=new char[nLength];
    sz=str.GetBuffer(0);
      

  13.   

    char* sz = (char *)str.GetBuffer(str.GetLength());强制转换一下就OK了么,'unsigned short *' 和 'char *' 本身就是一回事嘛。
      

  14.   

    char* sz=(LPTSTR)(LPCTSTR)str;
      

  15.   

    哎呀……你的CString是Unicode型的,你要是想发Unicode就直接(char*)强制转换之吧,要是不想,可以W2A()
      

  16.   

    void CWinsockClientDlg::OnChangeEditInf() 
    {
    CString   str;
    char CR[1]={13};
    char c[1];
    m_Inf.GetWindowText(str);
    str=str.Right(1);
    int nLength=str.GetLength();
    char * sz=new char[nLength];
    sz=str.GetBuffer(0);                    ///此处报错!
    send(s,sz,sizeof(char),0);}
    E:\WinsockClient\WinsockClientDlg.cpp(178) : error C2440: '=' : cannot convert from 'unsigned short *' to 'char *'
      

  17.   

    CHString s( L"abcd" );printf("CHString s %S", (LPCWSTR)s);
    LPWSTR p = s.GetBuffer( 10 );
    wcscpy( p, L"Hello" );   // directly access CHString buffer
    s.ReleaseBuffer( );
    printf("CHString s %S", (LPCWSTR)s);
      

  18.   

    str=str.Right(1);//这样str是\0
    int nLength=str.GetLength();
    char * sz=new char[nLength];//new出来干什么?
             send(s,sz,sizeof(char),0);//sizeof(char)? 你又想干什么?不明白你想干什么,你试试我改后的
    CString   str;
    m_Inf.GetWindowText(str);
    char* sz=(char*)str.GetBuffer(str.GetLength());      
    send(s,sz,strlen(sz),0);
      

  19.   

    谢谢楼上,按照你的方法正确了!
    只是不解其意思!我的意思是这样的,
    我在EVC4.0(嵌入式VC4.0,语法和VC6相似。)平台上做一个winsock通信的客户端,
    用户在文本框每键入一个字符,就调用send()发送至服务器端进行处理。
    而EVC的字符处理都是unicode编码方式,send()函数,发送数据的类型是char 型的。
    就是这么个转换问题了!
      

  20.   

    用(LPSTR)(LPCSTR)(str)强制转换就可以了,若用GetBuffer,你使用之后还要释放,麻烦
      

  21.   

    谁说“(LPSTR)(LPCSTR)(str)“可以?这种做法非常容易导致系统崩溃!这种做法根本不是将 CString转化为char *,而是将str指针指向一个CString的数据缓冲区,操作str等于会改变CString的变量,所以至少会出现以下两种严重错误:
    1.若str加长字符串的长度,会引起缓冲溢出,导致系统崩溃;
    2.CString有写引用机制(即多个CString初始公用一个内存,改写时再重新分配内存),而str改写CString时系统不会意识到要重新分配内存,所以你可能同时也会改变其他的变量!
    最规范的用法是:GetBuffer()。
    vc为CString提供GetBuffer自有它的道理,如果你想成为合格的程序员,就应该多花时间了解一些内部的机制,这也是那帮老外提倡的。
      

  22.   

    那把unicode转换成ANSI,然后发送了!
    CString   str;
    m_Inf.GetWindowText(str);
    USES_CONVERSION;
    LPSTR lpText = W2A(str);
    send(s,lpText,strlen(lpText),0);
      

  23.   

    char * a = (char *)(LPCSTR)str;
    unsigned char * a = (unsigned char *)(LPCSTR)str;
      

  24.   

    哈多人啊...  getbuffer()就ok了
      

  25.   

    CString str;
    std::string strTemp=(LPCTSTR)CString(str);
    const char*p=strTemp.c_str();
      

  26.   

    我现在只找到一种办法:
    WideCharToMultiByte(CP_ACP,0,str.GetBuffer(),-1,(LPSTR)szText,MAX_PATH,NULL,NULL);
    感觉是很麻烦。但好像没有别的办法了!
      

  27.   

    看大家见解都不一样,也不知道我这样写会不会引发程序莫名其妙的错误哟
    send(socket,Str.GetBuffer(0),Str.GetLength(),0);
      

  28.   

    CString s1(_T("Hello World"));
    CStringA s2(s1);
    char cData[MAX_PATH] = 0;
    strcpy_s(cData,sizeof(char)*MAX_PATH,s2);//或者s2.GetBuffer();之后直接s2.ReleseBufer();
    //这样写也可以
    CString s1(_T("Hello World"));
    strcpy_s(cData,sizeof(char)*MAX_PATH,CStringA(s2))//我经常这么用..没出过什么事.CString==CStringT Unicode下CStringT == CStringW 多字节下CStringT == CStringA msdn上面好像有这么转的...我忘了看到过一次.
      

  29.   

    char *    str;
    CString   strMsg;strMsg= ( CString ) "测试";
    strcpy( str,strMsg);
      

  30.   

    真是的,一个人都没有给出很好的办法。
    看来只好使用这样的办法了,拒绝使用CString!使用最原始的TCHAR*!