无论我用那种方法mch都只有一个字符"a",我的工程是_UNICODE
1
CString aaa= "adasd";
char *mch;
mch=(LPSTR)(LPCTSTR)aaa;
2
char mch[20];
memcpy(mch,&aaa,20); 
这是怎么回事?大家帮帮我

解决方案 »

  1.   

    1)LZ肯定是看错误了,mch是指针,只看到第一个值,LZ可以把*mch所对应的内存地址,放在内存中查看,看到底是多少?具体的方式是:调试-〉窗口-〉内存,然后看看
    2)c#中直接察看的是数组中的值,但c++不是
      

  2.   

    CString aaa ="dadfgsdfg";
      char mch[100];
      sprintf(mch,"%s",aaa);
    还是一个字符
      

  3.   

    char mch[20];
    memset(mch, 0x00, sizeof(char)*20);
    memcpy(mch,&_T("abcdef"),20); 
    这是我的测试代码,在自动窗口中观察等到的结果
    - mch 0x0012f2a0 "a" char [20]
    [0] 97 'a' char
    [1] 0 char
    [2] 98 'b' char
    [3] 0 char
    [4] 99 'c' char
    [5] 0 char
    [6] 100 'd' char
    [7] 0 char
    [8] 101 'e' char
    [9] 0 char
    [10] 102 'f' char
    [11] 0 char
    [12] 0 char
    [13] 0 char
    [14] 0 char
    [15] 0 char
    [16] 0 char
    [17] 0 char
    [18] 0 char
    [19] 0 char
      

  4.   

    其实你上面的两种方法都已经让mch是指向"adasd"的指针了,你可以通过很多方式看到,你说mch只有一个字符"a"那是*mch。另外,你的第二个方法的memcpy的第二个参数不应该再对aaa取址了,直接memcpy(mch, aaa, 20),
    进一步应该写成memcpy(mch, aaa, min(sizeof(mch), aaa.GetLength + 1)),避免对非法地址的写入和读取。
      

  5.   

    关键是我int len=MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,mch,-1,NULL,0); 通过这个得出的len也只是2,怎么回事?
      

  6.   

    MultiByteToWideChar
    为什么弄这么复杂@_@
      

  7.   

    mch其实已经转化过了,
    而转化后的值中第二个值就是0,也就是NULL;
    所以就得不到想要的值了。
    测试代码:
    char mch[20];
    memset(mch, 0x00, sizeof(char)*20);
    mch[0] = 0x41;
    mch[1] = 0x42;
    mch[2] = 0x43;
    mch[3] = 0x44;
    int len= MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,mch,-1,NULL,0);
    结果是5;就是因为第5个值为0
      

  8.   

    第三个参数是:Pointer to the character string to be converter,不能是WideChar
      

  9.   

    shanhqk 你有msn吗?
    其实我做了一大堆操作,就是为了把一个路径的字符串转成_T("")的格式,要不打开文件出错
    CString strFilePath="\\\\hostname\\aaa\\sas.csv";
    bRtn=objTxtFile.Open(strFilePath,CFile::modeCreate | CFile::modeWrite );
    出错
    如果下面这么写就没问题
    bRtn=objTxtFile.Open(_T("\\\\hostname\\aaa\\sas.csv"),CFile::modeCreate | CFile::modeWrite );
      

  10.   

    const wchar_t *lpctStr=(LPCTSTR)_T("E:\\c.txt");
    CFile objTxtFile;
    BOOL bRtn=objTxtFile.Open(lpctStr,CFile::modeCreate  ¦ CFile::modeWrite );
    if (bRtn)
    {
    TRACE("");
    }
    这个我的测试代码,LZ可以把_T换成strFilePath
      

  11.   

    因为你用的是_UNICODE 字符集,它用2个字节为字符编码。再内存中
    存储时先存储低字节,然后存储高字节。如0x0061在内存中先存储的是61
    然后是00.当你在输出的时候遇到00就终止了。所以其他的就不考虑了。通俗地
    说你应该调用UNICODE宽字符集的输出函数。
      

  12.   

    CString aaa = _T("adasd"); 
    char *mch; 
    mch = T2A(aaa); 
      

  13.   

    shanhqk 你的方法_T("E:\\c.txt")是好用,但是 替换成const wchar_t *lpctStr=(LPCTSTR)strFilePath; 
    就不行了,郁闷
    不过还是很感谢你
      

  14.   

    tools->options->debug->Display unicode strings这项勾上,在调试器里看看能不能看到字符串了。
      

  15.   

    #include <atlconv.h>CString aaa = _T("adasd");  
    char *mch; 
    USES_CONVERSION;
    mch = T2A((LPCTSTR)aaa);  如果要UNICODE下看字符串变量的值,可以这样设置:Tools->Options->Display unicode strings 打勾。
      

  16.   

    结贴 路径就直接定义为\\hostname\aaa\aaa.csv就行了,不用\->\\ 因为上述字符串是我ini文件定义的,我读取的