博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VC++及MFC 客符串转换
阅读量:4181 次
发布时间:2019-05-26

本文共 1803 字,大约阅读时间需要 6 分钟。

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://zxhai.baihongyu.com/

你可能感兴趣的文章
JPA主键生成策略
查看>>
byte数组和InputStream的相互转换
查看>>
InputStream,InputStreamReader和Reader之间的区别与关系
查看>>
Java中System.arraycopy方法的使用
查看>>
tk.mybatis的使用记录
查看>>
遍历获取目录下的所有文件
查看>>
从指定服务器路径下载文件
查看>>
EasyExcel读取和写入java model数据
查看>>
《C编译原理》共享库的动态加载和静态加载
查看>>
《Android系统学习》第二章:如何制作OTA U盘升级包
查看>>
《Android系统学习》第五章:编译Android的JDK环境
查看>>
《C++特性》之引用类型
查看>>
fflush(stdin)在gcc编译器中不起作用?
查看>>
《Android系统学习》第八章:Android gtest
查看>>
《Android系统学习》第九章:Android模拟器编译
查看>>
《Android系统学习》第十章:Android消息处理、消息循环和消息队列
查看>>
《Android系统学习》第十一章:Android应用程序Activity组件分析
查看>>
Android4.2 Input子系统
查看>>
《C++面向对象》结构体继承
查看>>
《tiny6410裸机程序》第二章:LED跑马灯RVDS精简main.c说明
查看>>