弱弱的一问:LPCTSTR t1 = _T("\xbb\xfd\xc0\xdb");
MessageBox(t1); //没问题,显示出"积累"但如果这个串,是从一个文件中,读至一个变量的,则MessageBox这一变量时,会显示"\xbb\xfd\xc0\xdb", 显然,C帮我自动做了转义. 可我现在需要它显示为"积累", 怎么写?
MessageBox(t1); //没问题,显示出"积累"但如果这个串,是从一个文件中,读至一个变量的,则MessageBox这一变量时,会显示"\xbb\xfd\xc0\xdb", 显然,C帮我自动做了转义. 可我现在需要它显示为"积累", 怎么写?
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显示 “积累”
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]);最后得到和编译器同样的结果。
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;
}
http://community.csdn.net/Expert/TopicView.asp?id=4998191
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);没出来结果.
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;
}
{
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.
解析 "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错.
}