1. 关于在WIN32中使用MFC中的CString、LPCWSTR、LPSTR等,必须添加头文件atlstr.h。
2. char* ,wchar*,char ch[10],tchar wch[10],LPSTR,LPCSTR,LPWSTR,LPCWSTR,CString等的转换问题。
对指针作强制转换注意:指针所指向的内容可能不完全,下面不用atoi就是因为这样
这可能是因为CString在VS2005中是宽字符格式,程序中如果采用强制转换将宽字符转换成ANSI字符,例如:(const char*)(strLeft.GetBuffer()),得到的指针将只包含原字符串的首字符。
int m_nChannelArray[100];
void StringToIntArray(LPCTSTR lpStr)
{
int nSubstrSize;
int nChannelNum;
CString str(lpStr);
int i = -1;
while ( nSubstrSize = str.Find(',') , i++ , nSubstrSize != -1 )
{
int nLength = str.GetLength();
CString strLeft = str.Left(nSubstrSize);
//nChannelNum = atoi((const char*)(strLeft.GetBuffer()));
nChannelNum = StrToInt((LPCTSTR)strLeft);
m_nChannelArray[i] = nChannelNum;
str = str.Right(nLength-nSubstrSize-1);
}
//m_nChannelArray[i] = atoi((const char*)(str.GetBuffer()));
m_nChannelArray[i] = StrToInt((LPCTSTR)str);
}
3. CString的奇怪问题:定义CString变量时最好初始化,否则编译器有可能用其他CString变量的值来初始化,CString变量在声明时只为指针分配了地址,并没有为指针所指向的内容分配地址,这个在初始化时才分配。
CString str = “”; 与 CString str = “ “;
关于宽字符和ANSI字符的图解:每个小格代表一个字节的内存空间。因为宽字符需要两个字节,ANSI字符只需要一个字节,因此它们的存储方式是不同的,如下:
wchar_t *pw = L”wide char”;
char *p = “ansi char”;
p = (char*)pw; // *p == “w” 为什么不是”wide char”呢?看图一下就明白了,p++后指针指向的内存中存储的值为0,即字符’/ 0’ ,它表示字符串结束。那为什么宽字符串不会结束呢?
因为pw指针++后,增加了2字节,指向了另一个字符’I’,因此宽字符串必须遇到连续两个字节内存空间中的值都为0,即字符’/ 0’ 才认为字符串结束。
0 ——> ‘/ 0’ 结束符
32 ——> ‘ ‘ 空格