本文共 1803 字,大约阅读时间需要 6 分钟。
VC++及MFC 中使用的字符串多达十几种,如何区分这些不同的字符串,以及如何在不同字符串格式之间转换,是一个很复杂的问题。这里仅给出一些常用的例子。
char * filename = "canon.wav";
wchar_t widearray[100]; mbstowcs(widearray, filename, 100); handle= mmioOpen(widearray, NULL,MMIO_READ|MMIO_ALLOCBUF);定义LPWSTR: LPWSTR widearray = L"canon.wav";
这两种类型基本是一样的。从 winnt.h 可以看到:
typedef char CHAR;...typedef CHAR TCHAR;...typedef const TCHAR *LPCTSTR;
因此可以直接进行类型转换。
但在打印到屏幕时,却不能通用:
std::string s=string("std-string"); 或者 std::string s="std-string";
char * ch="std-string";
ch=s.c_str();
s=string(ch);
CString cs;
char * ch; ch = cs.GetString(); // read only,不能修改 ch = cs.GetBuffer(n); // writable,可以被修改的长度为 n 的指针,使用完后最好调用cs.ReleaseBuffer()作为结束。注意 LPCSTR 和 LPCTSTR 是一样的。
CString cs;
LPCSTR lpcstr; lpcstr = (LPCTSTR)cs; lpcstr = cs.GetString(); // read only lpcstr = cs.GetBuffer(n); // writable因为CString已经重载了LPCTSTR运算符,所以CString类向const
char *转换时没有什么麻烦,如下所示:
char a[100];
CString str("aaaaaa");
strncpy(a,(LPCTSTR)str,sizeof(a));
//或者如下:
strncpy(a,str,sizeof(a));
以上两种用法都是正确地.因为strncpy的第二个参数类型为constchar *.所以编译器
会自动将CString类转换成constchar *.很多人对LPCTSTR是什么东西迷惑不解,让我们
来看看:
1.LP表示长指针,在win16下有长指针(LP)和短指针(P)的区别,而在win32下是没有区别
的,都是位.所以这里的LP和P是等价的.
2.C表示const
3.T是什么东西呢,我们知道TCHAR在采用UNICODE方式编译时是wchar_t,在普通时编译成char
那么就可以看出LPCTSTR(PCTSTR)在UINCODE时是constwchar_t *,PCWSTR,LPCWSTR,在
多字节字符模式时是constchar *,PCSTR,LPCSTR.
。。。
我们回到主题上来,在非UNICODE 模式下,当我们需要将CString转换成char *时,我们应该怎么做呢?其实只是麻烦一点。如下所示:
CString str("aaaaaaa"); strcpy(str.GetBuffer(10),"aa"); str.ReleaseBuffer();
当我们需要字符数组时调用GetBuffer(int n),其中n为我们需要的字符数组的长度.使用完成后一定要马上调用ReleaseBuffer();
Ref:
转载地址:http://zxhai.baihongyu.com/