字符串定义
C-Style字符串:C程序语言本身原并不支援字串数据结构。字符串通常以一个字符数组(或称阵列)或一个指向字符资料的指标指标来表达。由于C语言的数组不包含其长度的资讯,故亦无法表示所载之字符串之长度。C语言社群对此通用之解决方案为于字符串末端增添一数值0的字符。C语言的标准程序库中的字符串处理功能亦以此为基础。C-Style 字符串特点为不直接包含长度资讯。要取得字符串之长度,就必须从头到尾数算字符数目,直到遇到字符0为止。由于不设长度资讯,故C-style 字符串的长度理论上可以无上限。
Pascal-Style字符串:Pascal程序语言采取另一种方向处理字符串。在储存字串的记忆空间的开首,储存一固定长度整数以表达其长度。如此Pascal-style 字符串不需要在最后增添额外字符以标明其结束。但由于字符串开首储存字串长度的空间有限,故Pascal-style 的字串长度有上限。但在获得字串长度方面有速度优势。
BTSR字符串:BSTR是一种Pascal-Style字符串(明确标示字符串长度)和C-Style字符串(以\0结尾)的混合物,一般用于COM中,是Unicode字符串,即标示字符串长度,最后还有一个\0。-> 和pascal-style 字符串不同,指向BSTR字符串的指标指向第一个字符,而非开首的字串长度。故此适用于读取C-style 字符串的程序库同样适用于BSTR字符串(但写入则另作别论)。如果获得其长度,则以其指标地址减去字符串长度数值所需空间,以获得其字串长度之地址。
_bstr_t类型:_bstr_t 对象封装 BSTR 数据类型。 类管理资源分配,并释放通过函数调用添加到 SysAllocString 和 SysFreeString 和其他 BSTR API,时候。 _bstr_t 类使用引用避免额外的系统开销的计数。使用时要用来头文件comutil.h 和 库文件 comsuppw.lib
_wchar_t类型:宽字符
CComBSTR类型:也是封装了BSTR数据类型,使用时要用到头文件 atlbase.h。 ATL(Active Template Library)活动模板库,微软的COM(Component Object Model)技术。是一个以C++模板技术的类型的集合,是Microsoft为了简化Component Object Model(COM)的程序设计而发布的。 COM旨在允许开发者利用Visual C++创造各种各样的组件,包括OLE Automation服务器,与ActiveX控件。[1] [2] Patterned after the Standard Template Library (STL), ATL 包含一个对象向导(object wizard),当设置好主要的对象结构后,能够产生快速与较小的程序。。MFC程序通常较大而且需要支持DLL。 [3] ATL允许创建不需要支持DLL的更小的控件,所以ATL是一种在COM控件环境下MFC的轻量级替代物。
C风格字符串转换成其它类型的字符串:
#include <iostream>
#include <stdlib.h>
#include <string>
#include <comutil.h> //为了支持_bstr_t数据类型
#pragma comment(lib, "comsuppw.lib") //同样是为了支持_bstr_t 必须包含的库文件
#include <atlbase.h> //为了支持CComBSTR类型
#include <atlstr.h> //为了支持CStringA 和 CStringW
//#include <afx.h>
using namespace std;
int main()
{
char * orig = "Hello world!";
cout<<"char * : "<<orig<<endl;
size_t newsize = strlen(orig) + 1;
wchar_t *wcstring = new wchar_t[newsize];
//C风格字符串转换成 wchar_t 字符串
size_t convertsize = 0;
//mbstowcs(wcstring, orig, newsize); //将多字节字符序列转换成相应的宽字符序列
mbstowcs_s(&convertsize, wcstring, newsize, orig, _TRUNCATE);
wcout<<"wchar_t : "<<wcstring<<endl; //输出宽字符
//cout<<convertsize<<endl;
//C风格字符串转换成 _bstr_t 字符串
_bstr_t bstrt(orig);
//cout<<"_bstr_t : "<<bstrt<<endl;
bstrt = "_bstr_t : " + bstrt; //重载了操作符 +
cout<<bstrt<<endl;
//C风格字符串转换成 CComBSTR 字符串
CComBSTR ccombstr(orig);
//ccombstr += _T("CComBSTR"); //追加字符串
if(ccombstr.Append(_T("<CComBSTR>")) == S_OK){
//打印CComBSTR 字符串 需要先用CW2A printstr 处理
CW2A printstr(ccombstr);
cout<<printstr<<endl;
}
//C风格字符串转换成 CStringA 字符串
CStringA cstringa(orig);
cstringa = "CStringA : " + cstringa;
cout<<cstringa<<endl;
//C风格字符串转换成 CStringW 字符串
CStringW cstringw(orig);
cstringw = _T("CStringW : ") + cstringw;
//为了打印CStringW字符串,需要wcout 并且要转换成LPCTSTR-指向宽字符
wcout<<(LPCTSTR)cstringw<<endl;
//C风格字符串转换成 basic_string(std::basic_string) 字符串
string basicstring(orig);
basicstring = "basic_string : " + basicstring;
cout<<basicstring<<endl;
return 0;
}