需要将CString转换成char* 尝试了如下两种方式:
CString str = “123456”
char * buffer = (char *)LPCTSTR(str);
char * buffer = (char *)str.GetBuffer(str.GetLength());
用上述两种方式转换后,编译没问题 可是问题有点奇怪buffer出现如下这样的情况
buffer[0] = (49)'1'  //指向地址49值为‘1’
buffer[1] = 0
buffer[2] = (50)'2' 
buffer[3] = 0 
buffer[4] = (51)'3'
buffer[5] = 0
也就是说buffer指针偏移1,3,5都指向了0地址,这是怎么回事呢?
直观上以为应该是这样的:
buffer[0] = (49)'1'  //指向地址49值为‘1’
buffer[1] = (50)'2'
buffer[2] = (51)'3' 
buffer[3] = (52)'4' 
buffer[4] = (53)'5'
buffer[5] = (54)'6'
可是结果却如同上面这种情况。初步猜测可能是应为CString为UNICODE编码的缘故??请教下大家,谁能解释下了!!!C++ MFCCStringchar*类型转换

解决方案 »

  1.   

    不用初步猜测 你的情况一定是UNICODE字符集的问题
      

  2.   

    你鼠标右键你的工程-属性-字符集-(把使用uncoid字符集改成)使用多字符集,你先试一试看
      

  3.   

    你这是强制转换,cstring转char*的代码百度上很多,最正统也是最麻烦的widechartomultibyte(不知道写错了没),偷懒点的用W2A宏。
      

  4.   

    CString,CStringW,CStringA3个的关系跟TCHAR,WCHAR,CHAR一样,UNICODE下一个字符占2个字节,像数字字母一个字节表示就够了,另一个字节是是多余的,但为了规范用0填充。强制转换是不会改变源数据的内存布局的
      

  5.   


    谢谢你的解答
    我想我应该理解了我原来理解同你一样,UNICODE占2个字节,数字字母占一个字节另一个字节用0填充那么按照这种理解的话,结果应该是这样的才对啊:
    buffer[0] = (49)'1'  //指向地址49值为‘1’
    buffer[1] = (50)'0'
    buffer[2] = (51)'2' 
    buffer[3] = (52)'0' 
    buffer[4] = (53)'3'
    buffer[5] = (54)'0'
    就是不理解这里的出现的0指针
      

  6.   

    用空指针占位,当然是buffer[1] = 0
    如果是buffer[1] = (50)'0';这样这个内存地址中有值,值为0,还是空的吗?
    况且这里的 49 , 50, 51 指的是ASCII值,请参考ASCII代码对照表搞清楚这里49,50,的意思。
      

  7.   


    能解释下这些个函数的区别吗?谢谢!在学会写程序以前,搞清楚字符集的问题是很有必要的(大学里面老师是不会教这些的,我怀疑老师知道还是不知道...) LZ可以自己去查查资料大多数情况下,比如说一些公共函数,亦或者我们写的导出类库等等,函数当中涉及到字符或者字符串的时候,我们写的时候基本上要维护两套字符集很多时候我们不得不将字符集转来转去,这是不可避免的,比如说你的工程是 UNICODE,需要将一段字符串数据拷贝到剪切板中,或者你接收网络协议发来的数据需要解析等等
      

  8.   


    我直觉上也是这个问题,不过为什么这么转换后会出现0指针现象呢?那不是0指针,而是UNICODE字符集本身所有的特性:
    首先:
    而UNICODE的字符集不是用的char而是用的wchar_t
    再说char与wchar_t的不同处
    char
     是占8位 也就是一个字节共256种可能性,
     十六进制表示是从0x00~0xff,
     十进制表示从-128~127
     char本身是有符号型的所以可以用unsigned修饰wchar_t
     是占16位 也就是二个字节共65536种可能性
     十六进制表示是从0x0000~0xffff
     十进制表示从0~65535
     wchar_t 天生是无符号型的不能用像char一样用unsigned修饰char的字符0 为 0x30
    wchar_t的字符0 为 0x0030
    其它字符同理
    红色部分也就是你看到的中间有0的原因
      

  9.   

    回复于: 2013-05-13 09:14:46
    你这是强制转换,cstring转char*的代码百度上很多,最正统也是最麻烦的widechartomultibyte(不知道写错了没),偷懒点的用W2A宏。
      

  10.   

    T2A()
    或者WideCharToMultiBYte()
      

  11.   

    Unicode下的宽字节采用2个字节来存储一个字符,不管是英文,汉字,还是其他国家的文字,都有能用2个字节来进行编码,包括结束符'\0'。
    具体转化过程:CString str(_T("123456"));
    int nLength = WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), NULL, 0, NULL, NULL);   
    char buf[32] = {0};     
    WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), buf, nLength, NULL, NULL);   
      

  12.   

    我是这样转的:
        UpdateData(TRUE); CString STemp(_T("notepad"));//调用记事本 USES_CONVERSION;
    char* Str = T2A(STemp.GetBuffer());//系统宏T2A(W2A)
    STemp.ReleaseBuffer ();
        WinExec(Str,SW_SHOW);
      

  13.   


    有道理,谢谢提醒,确实这个是ASCII码了。
    结果这样:
    buffer[0] = (49)'1'
    buffer[1] = 0 //转换为了ASCII码值为0,为NUL
    buffer[2] = (50)'2' 
    buffer[3] = 0 
    buffer[4] = (51)'3'
    buffer[5] = 0其实我是想写一个类似串口调试助手的东西,作为练习的。
    下位机采用单片机将上位机的发送过来的数据后又发回上位机
    当我按照上面这种转换CString后,下位机只能接受到第一个1字符
    而如果我将CString采用循环的方式,复制到一个char数组中,则可以接收到1 2 3 4 5 6
    如果按照ASCII理解,除去buffer的第1 3 5偏移无法显示外,1 , 2 , 3这三个字符是应该能被下位机接受的可是下位机只能接收到1了,不知你有什么见解?
      

  14.   


    这个方法好用,谢谢 不过USES_CONVERSION;是不能少的,标记下。
      

  15.   

    哈哈
    char * buffer = (char *)str.GetBuffer(str.GetLength());
    这种代码又出来了!
    哥们 str.GetBuffer 返回 const char* 不是随便写的!
    你这样强制转换,然后修改buffer, CString会疯掉的
      

  16.   

    可以的,参见百度百科
    如果你使用这个指向由GetBuffer所改变返回的字符串内容,那么在你使用CString其他CString方法之前你必须调用ReleaseBuffer
    在调用ReleaseBuffer函数之后GetBuffer中的内容将无效(也就是销毁)
    当这个CString被销毁的时候,这个buffer所占用的内存将被自动释放
      

  17.   


    有道理,谢谢提醒,确实这个是ASCII码了。
    结果这样:
    buffer[0] = (49)'1'
    buffer[1] = 0 //转换为了ASCII码值为0,为NUL
    buffer[2] = (50)'2' 
    buffer[3] = 0 
    buffer[4] = (51)'3'
    buffer[5] = 0其实我是想写一个类似串口调试助手的东西,作为练习的。
    下位机采用单片机将上位机的发送过来的数据后又发回上位机
    当我按照上面这种转换CString后,下位机只能接受到第一个1字符
    而如果我将CString采用循环的方式,复制到一个char数组中,则可以接收到1 2 3 4 5 6
    如果按照ASCII理解,除去buffer的第1 3 5偏移无法显示外,1 , 2 , 3这三个字符是应该能被下位机接受的可是下位机只能接收到1了,不知你有什么见解?
    你把指针指传下去就行了,上面数据结构怎么传下去的下面就怎么接收就行了。
      

  18.   

    非常感谢大家的热心回答,这些天着重关注了下UNICODE和ANSI字符的问题,大家的回答让我学到了很多,再一次感谢大家。
    也认真阅读了《windows核心编程》的第1部分的,第2章的相关内容,又加深了自己的理解。
    建议由着方面问题的童鞋们,参考一下这部分内容。16 楼的 小段儿童鞋方法为推荐方法由于分少,意思下哈,结贴了! 谢谢各位!!