C++字符串完全指引之二:字符串封装类

引言

因为C语言风格的字符串容易出错且不易管理,黑客们甚至利用可能存在的缓冲区溢出bug把C语言风格的字符串作为攻击目标,所以出现了很多字符串封装类。不幸的是,在某些场合下我们不知道该使用哪个字符串类,也不知道怎样把一个C风格的字符串转换成一个字符串封装类。

这篇文章将介绍所有在Win32 API, MFC, STL, WTL 和 Visual C++ 运行库中出现的字符串类型。我将描述每一个类的用法,告诉大家怎样创建每一个类的对象以及怎样把一个类转换成其他类。受控字符串和Visual C++ 7中的类两部分是Nish完成的。

为了更好的从这篇文章中受益,你必须要明白不同的字符类型和编码,这些内容我在第一部分中介绍过。

Rule #1 of string classes

使用cast来实现类型转换是不好的做法,除非有文档明确指出这种转换可以使用。

促使我写这两篇文章的原因是字符串类型转换中经常遇到的一些问题。当我们使用cast把字符串从类型X转换到类型Z的时候,我们不知道为什么代码不能正常工作。各种各样的字符串类型,尤其是BSTR,几乎没有在任何一个地方的文档中被明确的指出可以用cast来实现类型转换。所以我想一些人可能会使用cast来实现类型转换并希望这种转换能够正常工作。

除非源字符串是一个被明确指明支持转换操作符的字符串包装类,否则cast不对字符串做任何转换。对常量字符串使用cast不会起到任何作用,所以下面的代码:

void SomeFunc ( LPCWSTR widestr );
main()
{
 SomeFunc ( (LPCWSTR) "C:\\foo.txt" ); // WRONG!
}

肯定会失败。它可以被编译,因为cast操作会撤消编译器的类型检查。但是,编译可以通过并不能说明代码是正确的。

在下面的例子中,我将会指明cast在什么时候使用是合法的。

C-style strings and typedefs

正如我在第一部分中提到的,windows APIs 是用TCHARs来定义的,在编译时,它可以根据你是否定义_MBCS或者_UNICODE被编译成MBCS或者Unicode字符。你可以参看第一部分中对TCHAR的完整描述,这里为了方便,我列出了字符的typedefs

Type Meaning
WCHAR Unicode character (wchar_t)
TCHAR MBCS or Unicode character, depending on preprocessor settings
LPSTR string of char (char*)
LPCSTR constant string of char (const char*)
LPWSTR string of WCHAR (WCHAR*)
LPCWSTR constant string of WCHAR (const WCHAR*)
LPTSTR string of TCHAR (TCHAR*)
LPCTSTR constant string of TCHAR (const TCHAR*)
时间: 2024-09-21 20:11:11

C++字符串完全指引之二:字符串封装类的相关文章

C++字符串完全指引之二 —— 字符串封装类

C++字符串完全指引之二 -- 字符串封装类 原著:Michael Dunn 作者:Chengjie Sun 原文出处:CodeProject:The Complete Guide to C++ Strings, Part II  引言 因为C语言风格的字符串容易出错且不易管理,黑客们甚至利用可能存在的缓冲区溢出bug把C语言风格的字符串作为攻击目标,所以出现了很多字符串封装类.不幸的是,在某些场合下我们不知道该使用哪个字符串类,也不知道怎样把一个C风格的字符串转换成一个字符串封装类. 这篇文章

通过ADO连接各种数据库的字符串翠集(二)(完)

ado|数据|数据库|字符串 (接上篇) 二 二.接下来讲使用OLE DB来连接数据库的例子. 1) OLE DB Provider for Active Directory Service <% Dim oConn,strConn Set oConn=Server.CreateObject("ADODB.Connection") StrConn= "Provider=ADSDSOObject;" & _ "User Id=myUsernam

C++字符串完全指引之一:Win32 字符编码

引言 毫无疑问,我们都看到过像 TCHAR, std::string, BSTR 等各种各样的字符串类型,还有那些以 _tcs 开头的奇怪的宏.你也许正在盯着显示器发愁.本指引将总结引进各种字符类型的目的,展示一些简单的用法,并告诉您在必要时,如何实现各种字符串类型之间的转换. 在第一部分,我们将介绍3种字符编码类型.了解各种编码模式的工作方式是很重要的事情.即使你已经知道一个字符串是一个字符数组,你也应该阅读本部分.一旦你了解了这些,你将对各种字符串类型之间的关系有一个清楚地了解. 在第二部分

C++字符串完全指引之一 —— Win32 字符编码

C++字符串完全指引之一 -- Win32 字符编码 原著:Michael Dunn 翻译:Chengjie Sun 原文出处:CodeProject:The Complete Guide to C++ Strings, Part I  引言 毫无疑问,我们都看到过像 TCHAR, std::string, BSTR 等各种各样的字符串类型,还有那些以 _tcs 开头的奇怪的宏.你也许正在盯着显示器发愁.本指引将总结引进各种字符类型的目的,展示一些简单的用法,并告诉您在必要时,如何实现各种字符串

visual basic-VB判断字符串中是否有二联号

问题描述 VB判断字符串中是否有二联号 解决方案 dim n = 0 for i = 2 to len(s) if mid(s,i,1)=mid(s,i-1,1) then n = n + 1 else n = 1 if n =3 then msgbox "三联":exit for next

求一个字符串编辑成为另一个字符串的最少操作数

原题链接: http://oj.leetcode.com/problems/edit-distance/ 这道题求一个字符串编辑成为另一个字符串的最少操作数,操作包括添加,删除或者替换一个字符.这道题难度是比较大的,用常规思路出来的方法一般都是brute force,而且还不一定正确.这其实是一道二维动态规划的题目,模型上确实不容易看出来,下面我们来说说递推式. 我们维护的变量res[i][j]表示的是word1的前i个字符和word2的前j个字符编辑的最少操作数是多少.假设我们拥有res[i]

字符串格式不正确 将一个字符串转换为datatime,先分析字符串以获取日期 。怎么改啊求高手帮忙

问题描述 字符串格式不正确 将一个字符串转换为datatime,先分析字符串以获取日期 .怎么改啊求高手帮忙 string sql1 = "insert into shuju(sid,m1,date,time1,time2,m2,state,m3,status,m4,tq_state,m5,msg_count,m6,msg_bytes) values ('" + Convert.ToSingle(sid.Trim()) + "','" + Convert.ToSin

c语言-如何将数字字符串转为16进制字符串?

问题描述 如何将数字字符串转为16进制字符串? 请教一个示例:如何将数字字符串转为16进制字符串?字符串:char str[20]="1234567890123456";将中间的"789012"转换为16进制的"0C0A14":最后str=""1234560C0A143456"" 如果有描述不清的地方,请指出.多谢! 解决方案 你先用字符串截取到 比如strstr等,""789012&q

select * from 表名 where 1=1and name like &amp;amp;#39;%字符串%&amp;amp;#39; 其中like%字符串%是什么意思

问题描述 select * from 表名 where 1=1and name like '%字符串%' 其中like%字符串%是什么意思 select * from 表名 where 1=1and name like '%字符串%' 其中like%字符串%是什么意思 解决方案 这个用到了正则表达式,like '%字符串%'是 名字 中 有 '%字符串%' 的都查找出来. 解决方案二: 先森,这个是模糊查询 解决方案三: like是关键词,表明这是一个模糊查询 % 代表零或者多个字符