wchar_t,char,string,wstring等的总结

摘要:
在Unicode环境下,无论怎么赋值都是Unicode编码,比如:CStringa,不加L修饰依然可以通过。

一、LPSTR LPCSTR LPTSTR LPCTSTR等

确定的类型:
LPSTR = CHAR * = char *LPCSTR = const CHAR * = char *  //c意为const 
不确定类型(可变型):
LPTSTR = LPWSTR = WCHAR * = wchar_t * //(Unicode编码)
= LPSTR  = CHAR *  = char *  //(多字节编码) 
TCHAR  = wchar_t //Unicode编码
= char    //多字节编码  

二、CString与char *

  • 多字节环境:CString等价于const char *,因此,在const char *的参数下可以直接使用CString,但是不能用于char *。

例:

void show(const char *name)
{
    AfxMessageBox(name);
}    
.........

CString name("luotian");
show(name); //可以通过

CString可以智能化
在多字节环境下无论怎么赋值都是ASCII编码,比如:CString a(L"luotian"),加上L修饰,CString依然将它进行ASCII编码。
在Unicode环境下,无论怎么赋值都是Unicode编码,比如:CString a("luotian"),不加L修饰依然可以通过。

  • CString与LPCTSTR

在函数参数需要LPTSTR,LPCTSTR等等时,CString变量可以直接使用.

//例如:在Unicode环境下:
CString a("Luotian");
MessageBox(a);
  • CString->LPTSTR

//强制类型转换
CString a("Luotian");
LPTSTR p =(LPTSTR)(LPCTSTR)a;

//用CString的GetBuffer()方法
LPTSTR p = a.GetBuffer();
  • LPTSTR->CString

可以直接赋值操作.

三、char * 与 wchar_t *的互换(重点

  • ASCII->Unicode

LPSTR source ="Luotian";//源串
size_t len = strlen(source) + 1;
size_t converted = 0;
LPTSTR dest= (LPTSTR)malloc(len*sizeof(WCHAR));
 
mbstowcs_s(&converted,dest,len,source,_TRUNCATE);  
  • Unicode->ASCII
#define WChar2Char(lpWideCharStr,cbWideChar,lpMultiByteStr,cbMultiByte) WideCharToMultiByte(CP_ACP, 0, lpWideCharStr, cbWideChar, lpMultiByteStr, cbMultiByte, NULL, NULL)
例:
WChar2Char(source,-1,dest,cb字节数);
TCHAR dest[256];
LPCWSTR source=L"Luotian";
WChar2Char(source, -1, dest, 256);

四、string和wstring

  • string->const char *(LPCSTR)和wstring->const wchar_t * (等价于LPCTSTR)

//采用.c_str()方法;
string a("Luotian");
const char * p = a.c_str();
  • char * p->string

char * p = "luotian";
string a=p;
//string和CString的一个区别在于:函数参数需要LPTSTR时,CString可以直接用,而string不行。

免责声明:文章转载自《wchar_t,char,string,wstring等的总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇DELPHI中的消息处理机制(三种消息处理方法的比较,如何截断消息)excel多组数据散点图生成下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ReactNative: 了解相机第三方库react-native-camera的使用

一、简介 在前一篇文章中,初步介绍了RN提供的关于相机功能CameraRoll的使用了。很多时候,这种最基础的API有时很难满足功能需求,此时,如果不想重复造轮子,我们可以选择一个完善好用的第三库。react-native-camera就是一个非常不错的关于相机功能的第三方库,使用这个框架基本能满足大多数的需求,现在来简单研究一下。 二、安装 1、同样地道...

手把手教学在Springboot中搭建使用Guava cache,包教包会,不会我输一包辣条给你

 guava cache使用简介   概述   缓存是日常开发中经常应用到的一种技术手段,合理的利用缓存可以极大的改善应用程序的性能。   Guava官方对Cache的描述连接   缓存在各种各样的用例中非常有用。例如,当计算或检索值很昂贵时,您应该考虑使用缓存,并且不止一次需要它在某个输入上的值。   缓存ConcurrentMap要小,但不完全相同。最...

pytest文档40-pytest.ini配置用例查找规则(面试题)

前言 面试题:pytest如何执行不是test开头的用例?如执行 xxx_*.py这种文件的用例。 pytest.ini 配置文件可以修改用例的匹配规则。 pytest命令行参数 cmd打开输入pytest -h 查看命令行参数找到 [pytest] ini-options python_files (args) 匹配 python 用例文件, 如tes...

RocketMQ 参数详解

    NameServer配置属性 参数名 参数类型 描述 默认参数(时间为单位ms,数据单位为byte) rocketmqHome String RockerMQ主目录,默认用户主目录   namesrvAddr String NameServer地址   kvConfigPath String kv配置文件路径,包含顺序...

c 结构体中的变长数组

在Linux系统里,/usr/include/linux/if_pppox.h里面有这样一个结构: structpppoe_tag{ __u16tag_type; __u16tag_len; chartag_data[0]; }__attribute((packed)); 最后一个成员为可变长的数组,对于TLV(Type-Length-Value)形式的结...

原有vue项目接入typescript

原有vue项目接入typescript 为什么要接入typescript javascript由于自身的弱类型,使用起来非常灵活。 这也就为大型项目、多人协作开发埋下了很多隐患。如果是自己的私有业务倒无所谓,主要是对外接口和公共方法,对接起来非常头疼。主要表现在几方面: 参数类型没有校验,怎么传都有,有时会出现一些由于类型转换带来的未知问题。 接口文档不...