刚接触windows编程的人对好些变量很是头痛,就拿字符串举个小例子吧, 标准的C/C++ char char* wchar_t string window中定义的变量类型 CHAR WCHAR LPWSTR LPCSTR LPSTR LPCTSTR LPCWSTR LPCSTR MFC中还有一个CString 我在刚接触的时候,头痛得不得了,经过几个月时间的研究终于得出一些心得;下面我给出它们的定义 typedef char CHAR typedef CHAR * LPSTR typedef const LPSTR LPCSTR typedef wchar_t WCHAR typedef WCHAR * LPWSTR typedef const LPWSTR LPCSTR #ifdef _UNICODE typedef LPTSTR LPWSTR typedef LPCTSTR LPCWSTR #else typedef LPTSTR LPSTR typedef LPCTSTR LPCSTR #endif 这些个定义在“winnt.h”里,看到这里知道微软有多变态了吧! 下面来解释一下CString ,它是一个模板类,它用来维护一个底层的字符串缓冲区,并重载了一些操作符,例如+,==,=,+=,<,>.!=,等,在我看来就是对底层字符串的处理的一个封装, +是对strcat,wcscat的封装,==是对strcmp,wcscmp的一个封装等等。 CString 底层缓冲区是什么类型的,CString 维护的缓中区类型CStringT,我给出的定义是,可以按我的理解,但决对不是我这样子的 #ifdef _UNICODE typedef CStringT LPSTR #else typedef CStringT LPWSTR #endif 可以按这样理解,但真正的定义不是这样的哦。 明白了以上这些,我们来看一下字符串的转化吧 1。CHAR || WCHAR ==》CString 可以使用CString的构告函数CString(LPCTSTR);直接转化 2。CString==>CHAR || WCHAR 选用new出一个CString.GetLength()+1的空间。 再用strcpy_s()或者wcscpy_s();实一拷贝 最后不要忘了delete呀! 如果只想得到CString的缓冲区的话,您可以使用 LPTSTR lpBuffer=CStirng::GetBuffer(); 如果你不是写缓冲不用释放缓冲区,如果执珩了写操作的话,哪么就得ReaseBuffer()释放掉这个缓冲区,让别人去用了。这个相当于一个回写的过程。 3。ANSI字符的转化为宽字符==char ==>WCHAR 我的做法是一位一位的复值,道先复一个有用的值再赋一个‘/0’; 得完全部之后,用memcpy(),写进一个宽字符里; 4.wchar==>转化为char 如果wchar里存放的是ansi字符可以这样做 char[i]=wchar[2*i]; 如果wchar 里存放有汉字等非ascall码,就不能转化了,因为转化会丢夫信息的; 但是仅仅是用来传送,比如说网络上传送的话,哪就无所谓了,从wchar转化为char,对方再按wchar解析出来,哪就无所谓了,肯定总是正确的。 不过见意使用BYTE字符串来在网络间,或是进程间传送数据,它的定义是这样的 typedef unsigned char BYTE ; typedef BYTE * LPBYTE ; |
windows编程字符串处理的一些问题!