VC++及MFC 客符串转换

VC++及MFC 中使用的字符串多达十几种,如何区分这些不同的字符串,以及如何在不同字符串格式之间转换,是一个很复杂的问题。这里仅给出一些常用的例子。

 

1. char * 转 LPWSTR

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";

 

2. char * 与 LPCTSTR

 这两种类型基本是一样的。从 winnt.h 可以看到:

typedef char CHAR;
...
typedef CHAR TCHAR;
...
typedef const TCHAR *LPCTSTR;

因此可以直接进行类型转换。

但在打印到屏幕时,却不能通用:

  1. 打印 char * 是 printf("print char*: %s", ch);
  2. 打印 LPCTSTR 是 wprintf(L"print LPCTSTR:%s", lpctstr); // L"xxx" 将 xxx 转换为宽字符?

3. char * 与 std::string

std::string s=string("std-string");  或者 std::string s="std-string";

char * ch="std-string";

ch=s.c_str();

s=string(ch);

4. CString to char *

CString cs;
char * ch;
ch = cs.GetString();   // read only,不能修改
ch = cs.GetBuffer(n);  // writable,可以被修改的长度为 n 的指针,使用完后最好调用cs.ReleaseBuffer()作为结束。

 5. CString to LPCSTR (LPCTSTR)

注意 LPCSTR 和 LPCTSTR 是一样的。

CString cs;
LPCSTR lpcstr;
lpcstr = (LPCTSTR)cs;
lpcstr = cs.GetString();  // read only
lpcstr = cs.GetBuffer(n);  // writable

6. CString 剖析

因为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://blog.csdn.net/cobay/article/details/3556307

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值