弱弱的一问:LPCTSTR t1 = _T("\xbb\xfd\xc0\xdb"); 
MessageBox(t1);    //没问题,显示出"积累"但如果这个串,是从一个文件中,读至一个变量的,则MessageBox这一变量时,会显示"\xbb\xfd\xc0\xdb", 显然,C帮我自动做了转义. 可我现在需要它显示为"积累", 怎么写?

解决方案 »

  1.   

    测试文件1.txt, 文件内容:\xbb\xfd\xc0\xdb测试代码:
    CString str;
    BYTE by[4];
    if(file.Open("c:\\22.txt", CFile::modeRead))
    {
    file.ReadString(str);
    sscanf(str, "\\x%x\\x%x\\x%x\\x%x", &by[0], &by[1], &by[2], &by[3]);
    MessageBox((LPCTSTR)by);
    file.Close();
    }测试结果,MessageBox显示 “积累”
      

  2.   

    原因LPCTSTR t1 = _T("\xbb\xfd\xc0\xdb");
    MessageBox(t1); //没问题,显示出"积累"之所以显示“积累”,是因为编译器在编译时为我们解析_T("\xbb\xfd\xc0\xdb"),将之\xbb\xfd\xc0\xdb等字符量转换为一个4字节的字符串,每字节值为字面的转义值。在程序要将文件中的字符串显示为"积累",就需要模拟编译器的工作,解析该字符串,于是就有代码:
    sscanf(str, "\\x%x\\x%x\\x%x\\x%x", &by[0], &by[1], &by[2], &by[3]);最后得到和编译器同样的结果。
      

  3.   

    谢谢SoLike(思危) , 那么, 如果c:\22.txt里, 文本不定长呢?
      

  4.   

    比如说: "D:\\\xbb\xfd\xc0\xdb\\VC\\TEST\\CCoolMenu.cpp"或者其它什么的,长度根本不固定? 
      

  5.   

    #include <stdio.h>
    int ExpressionToString( // 字符表达式转化成字符串
      char *mExpression, // [in]输入表达式
      char *nDest // [out]输出缓冲区,允许该参数为NULL计算输出长度用
    ) // 返回填写的长度,如果表达式出现错误则返回-1
    {
            /* TODO : 填写代码 */
            int I = 0;
            char vHex[3];
            int vNumber;
            while (mExpression != NULL && *mExpression != NULL)
            {                if (memcmp(mExpression, "\x", 2))
                    {
                            mExpression += 2;
                            strncpy(vHex, mExpression, 2);
                            vHex[2] = NULL;
                            sscanf(vHex, "%x", &vNumber); // 十六进制转化为数字
                            nDest[I] = vNumber;
                            mExpression += 2;
                    } else mExpression++;
                    I++;
            }
            nDest[I] = NULL;
            return I;
    }
      

  6.   

    to SoLike: 此贴和我问的类似,请关注
    http://community.csdn.net/Expert/TopicView.asp?id=4998191
      

  7.   

    char szTarget[MAX_PATH + 1]; 
    char *p = szTarget;memset(szTarget, 0, sizeof(szTarget));BYTE tmp[MAX_PATH + 1];
    memset(tmp, 0, sizeof(tmp));
    for (int i = 0; i < strlen(szTarget); i++)
      sscanf(p++, "\\x%x", &tmp[i]);
    MessageBox((LPTSTR)tmp);没出来结果.
      

  8.   

    真想删了自己刚发上去的代码, 呵呵,羞中..... 试试zswang的代码先.
      

  9.   

    #include <stdio.h>
    int ExpressionToString( // 字符表达式转化成字符串
      char *mExpression, // [in]输入表达式
      char *nDest // [out]输出缓冲区,允许该参数为NULL计算输出长度用
    ) // 返回填写的长度,如果表达式出现错误则返回-1
    {
            /* TODO : 填写代码 */
            int I = 0;
            char vHex[3];
            int vNumber;
            while (mExpression != NULL && *mExpression != NULL)
            {
                    if (0 == memcmp(mExpression, "\\x", 2))
                    {
                            mExpression += 2;
                            strncpy(vHex, mExpression, 2);
                            vHex[2] = NULL;
                            sscanf(vHex, "%x", &vNumber); // 十六进制转化为数字
                            nDest[I] = vNumber;
                            mExpression += 2;
                    } else if (0 == memcmp(mExpression, "\\\\", 2))
                    {
                            mExpression += 2;
                            nDest[I] = '\\';
                    } else
                    {
                            nDest[I] = *mExpression;
                            mExpression++;
                    }
                    I++;
            }
            nDest[I] = NULL;
            return I;
    }
      

  10.   

    int ExpressionToString(char *mExpression, char *nDest)
    {
            int i = 0;
            char vHex[9];
            BYTE b[2];
    char* p = nDest;
            while (mExpression != NULL && *mExpression != NULL )
            {                if (strncmp(mExpression, "\\x", 2) == 0)
                    {

                            strncpy(vHex, mExpression, 8);
                            vHex[8] = NULL;
                            sscanf(vHex, "\\x%x\\x%x", &b[0], &b[1]); // 十六进制转化为数字
    sprintf(p + i, "%c%c", b[0], b[1]);
    i += 2; mExpression += 8;
                    } 
    else 
    {
    nDest[i] = *mExpression;
    mExpression++;
                    i++;
    }
            }
            nDest[i] = NULL;
            return i;
    }跟踪时,发现已经正确读出来了,可执行return i 后, 提示,C Runtime Error: stack around 'b' corrupt.
      

  11.   


    解析 "D:\\\xbb\xfd\xc0\xdb\\VC\\TEST\\CCoolMenu.cpp"
    还有很多的疑问, 勉强搞出来的代码, 请大家指教. 不胜感激!void ExpressionToString(char *mExpression, char *nDest)
    {
            BYTE *b = new BYTE(2);
            int i = 0;
            char vHex[9];
            char* p = nDest;
            while (mExpression != NULL && *mExpression != NULL )
            {
                  if (strncmp(mExpression, "\\x", 2) == 0)
                  {
              
                      strncpy(vHex, mExpression, 8);
                      vHex[8] = NULL;
                      sscanf(vHex, "\\x%x\\x%x", b, b+1); // 十六进制转化为数字
                      sprintf(p + i, "%c%c", *b, *(b+1));
                      i += 2;                  mExpression += 8;
                  } 
                  else if(strncmp(mExpression, "\\\\", 2) == 0)
                  {
                    strncpy(vHex, mExpression, 2);
                    vHex[2] = NULL;
                    sscanf(vHex, "\\%c", b);
                    sprintf(p + i, "%c", *b);
                    i += 1;
                    mExpression += 2;
                  }
                  else 
                  {
                    nDest[i] = *mExpression;
                    mExpression++;
                    i++;
                  }
            }
            nDest[i] = NULL;
            //delete[] b;         为什么不能放开? 一放开, 就提示stack corrupted错. 
    }
      

  12.   

    看这里:BYTE *b = new BYTE(2); -------------〉 BYTE *b = new BYTE[2];
      

  13.   

    如果 new BYTE[5]就不会出堆栈错. 变量需要对齐?