AnsiString类是BCB中最常见类之一,了解它对以后深入学习BCB大有帮助。

介绍AnsiString类之前,先要介绍一些背景知识。VCL(Visual Component Library 可视化组件库)大量利用Pascal长字串数据类型,几乎所有基于文本的VCL属性都采用Pascal长字串。例如,Text、Name和Caption属性都是Pascal长字串属性。VCL的许多构件方法和事件处理函数也采用Pascal长字串。由于VCL大量使用Pascal长字串,而C++ Builder使用Pascal VCL,所以Borland生成一个C++类来近似Pascal长字串,这个类就是AnsiString类,可以代替Pascal长字串。

AnsiString类是功能很强的字串类。AnsiString类的内存空间是动态分配的,引用计数,并使用了更新前拷贝(copy­-on-write)技术。这类字符串长度没有限制,其字符类型是ANSIChar
类型。AnsiString类构造器可以从Char、Char*、int或double生成AnsiString类对象。这些构造器很容易将直接字串赋予AnsiString类并将整数或浮点数变成字串。

AnsiString重载了一系列操作符,如下:

· 赋值:“=”

· 字符串链接:“+”、“+=”

·
字符串比较:“==”、“>”、“<”、“<=”、“>=”、“!=”

·
访问:“[]”,用此操作符可以象数组一样访问字符串中的字符。注意:这个地方和C中数组的用法不兼容,第一个字符的下标是1,而不是0。当下标为0时,会抛出一个异常。下面的讨论中提及第index个字符的都是与此相同,不再说明。

方法:

1. char* c_str()

返回当前的对象的字符串空间的首指针,它指向的内容即AnsiString中包含的字符串。

Example:

AnsiString str = "Hello World!";

ShowMessage(str.c_str()); // 显示一个Hello World!的消息框

能否用这个返回值访问/修改字符串中的内容?

Example:

AnsiString a = "I want to modify this using pointer";

char *p = a.c_str();

p[0] = 'i';

........          
//指针操作

ShowMessage(a);

可以,但不推荐!

因为AnsiString是动态分配的,所以该字符指针不是永远不变的,而是随时会变的,所以该指针只是一个临时的指针,不要永久的保存,因为说不定什么
时候就“野”了。当需要修改字符串的内容时,用[]操作符或用类提供的方法(Insert、Delete等)完全可以实现。

2.AnsiString& Delete(int index, int count)

在字符串中删除从index开始的count个字符。如果index大于字符串的长度,则此方法不删除任何字符;如果count大于从index开始的剩余字符数目,则此方法删除从
index 开始的所有字符。

3.AnsiString& Insert(const
AnsiString& str, int index)

在字符串的index位置插入字符串str。

4.int AnsiCompare(AnsiString& rhs)

比较两个AnsiString的内容是否相同,与“==”的区别在于当内容相等的时候前者返回0,而后者返回true。

int AnsiCompareIC(AnsiString& ths)

不区分大小写的比较。

5.int Length()

返回字符串长度,不包括终止符'\0'!

6.bool IsEmpty() const

判断字符串是否为空。

   

7.AnsiString SubString(int index, int count)

返回一个新的AnsiString, 内容为原字符串从第index个字符开始,长度为count子串。

Example:

AnsiString str = "Hello World!";

ShowMessage(str.SubString(7, 5)); // 显示内容为 World

8.int Pos(AnsiString& subStr)

查找内容为subStr的字串,如果有,返回字串的第一个字符位置 如果没有,返回0。

9.AnsiString LowerCase()

AnsiString UpperCase()

返回一个新的AnsiStirng, 为当前字符串转化为小写/大写的结果。

10. AnsiString& SetLength(int newLength)

返回字符串的Length属性为newLength,内容是原字符串中1-newLength的内容。

11.static AnsiString FormatFloat(const
AnsiString& format, const long
double& value)

将value用format指定的格式转换为字符串形式。

12.AnsiString& sprintf(char *, ...)

利用sprintf强大功能格式化当前字符串,详细用法请参考sprintf或者printf

13.int ToInt() const

   int ToIntDef(int defaultValue)
const

返回当前字符串转化为整数的结果,不同点在于,当不能转化时,前者抛出一个异常,而后者返回defaultValue。

   double ToDouble() const

将字符串转换为一个浮点数。如果字符串无可用的转换字符,则产生异常。

14.static AnsiString IntToHex(int value, int digits)

将一个整数转换为16进制的字符串形式。

15.AnsiString Trim() const

返回一个新字符串,新字符串中删除了原字符串中前导和后随的空字符串,以及字符串中的控制字符。常用于输出字符串时删除前面和后面的空格。

AnsiString TrimLeft()
const

   AnsiString TrimRight()
const

分别删除字符串前导和后随的空格字符以及控制字符。

注意:处理不了全角的空格。

16.char* AnsiLastChar()

返回字符串的最后一个字符。

17.static AnsiString StringOfChar(char ch, int count)

返回一个包含count个字符ch的字符串。

相关函数(详细的请参阅BCB help):

BoolToStr() // 将bool类型转换成AnsiString

StrToBoll()

IntToStr() // 将int转换成AnsiString

StrToFloat() // 将AnsiString转换成float

FloatToStr()

StringToColor() // 将AnsiString转换成Tcolor类

ColorToString

其他:

看下面的代码:

AnsiString src="test AnsiString";

AnsiString strTest=src; //拷贝构造

char* cp=strTest.c_str();

cp[0]='T';

运行完后,strTest和src的值是什么呢?结果可能与你所预想的大不相同,两都的值都变成了"TestAnsiString"!也就是说
cp[0]='T'的操作同时改变了两个AnsiString变量的值。为什么会这样呢,执行时按下Ctrl鼠标单击两个变量名,你会发现它们两个所指
向内部字符串是同一个!也就是说在拷贝构造(赋值也一样)时并没有象我们想象的那样进行内部字符串的复制!

再看下面的代码:

AnsiString src="test AnsiString";

AnsiString strTest=src; //拷贝构造

strTest[1]='x';

char* cp=strTest.c_str();

cp[0]='T';

运行结果就是我们的预期了,为什么加了句strTest[1]='x';就"正常"了呢?很明显AnsiString为了我们第一个问题中的效率问题采用
了copy
on
write技术,也就是只读共享,写时拷贝。这样只有在对象要改变其内部数据的值时才做一份自己的拷贝然后在自己的拷贝中进行修改(就种技术在操作系统中
被广泛使用)。同时在对象析构时如果引用计数大于0,数据也不会被删除,它保证数据的有效性。这样返回AnsiString变量的函数也就没有严重的效率
问题了。

BCB中AnsiString类方法小结的更多相关文章

  1. OC基础--OC中的类方法和对象方法

    PS:个人感觉跟C#的静态方法和非静态方法有点类似,仅仅是有点类似.明杰老师说过不要总跟之前学过的语言做比较,但是个人觉得,比较一下可以加深印象吧.重点是自己真的能够区分开! 一.OC中的对象方法 1 ...

  2. C++ builder 中AnsiString的字符串转换方法大全

    C++ builder 中AnsiString的字符串转换方法大全 //Ansistring 转 charvoid __fastcall TForm1::Button1Click(TObject *S ...

  3. python中,类方法和静态方法区别。

    面相对象程序设计中,类方法和静态方法是经常用到的两个术语. 逻辑上讲:类方法是只能由类名调用:静态方法可以由类名或对象名进行调用. 在C++中,静态方法与类方法逻辑上是等价的,只有一个概念,不会混淆. ...

  4. MVC图片上传详解 IIS (安装SSL证书后) 实现 HTTP 自动跳转到 HTTPS C#中Enum用法小结 表达式目录树 “村长”教你测试用例 引用provinces.js的三级联动

    MVC图片上传详解   MVC图片上传--控制器方法 新建一个控制器命名为File,定义一个Img方法 [HttpPost]public ActionResult Img(HttpPostedFile ...

  5. 180531-Spring中JavaConfig知识小结

    原文链接:Spring中JavaConfig知识小结/ Sring中JavaConfig使用姿势 去掉xml的配置方式,改成用Java来配置,最常见的就是将xml中的 bean定义, scanner包 ...

  6. [转] SpringBoot RESTful 应用中的异常处理小结

    [From] https://segmentfault.com/a/1190000006749441 SpringBoot RESTful 应用中的异常处理小结 永顺 2016年08月29日发布 赞  ...

  7. hiredis中异步的实现小结

    hiredis中异步的实现小结 原文: http://blog.csdn.net/l1902090/article/details/3858... 时间: 2014-08-15 前言 一般情况下我们使 ...

  8. BCB中选择文件对话框TOpenDialog过滤后缀名使用方法

    BCB中使用TOpenDialog选择对话框时,直接OpenDialog->Execute()弹出的对话框是显示所有文件的,如果我们希望过滤指定的文件后缀名就需要在Execute()前做一些初始 ...

  9. C#不用union,而是有更好的方式实现 .net自定义错误页面实现 .net自定义错误页面实现升级篇 .net捕捉全局未处理异常的3种方式 一款很不错的FLASH时种插件 关于c#中委托使用小结 WEB网站常见受攻击方式及解决办法 判断URL是否存在 提升高并发量服务器性能解决思路

    C#不用union,而是有更好的方式实现   用过C/C++的人都知道有个union,特别好用,似乎char数组到short,int,float等的转换无所不能,也确实是能,并且用起来十分方便.那C# ...

随机推荐

  1. base64随机字符混淆加密、解密-美拍视频地址解密,反推加密算法

    用火车头测试采集美拍的数据时无意中发现美拍的视频地址是一段加了混淆字符串的base64代码.如下图 于是好奇之下研究了下解密算法.具体过程省略800字.发现美拍的视频解密是通过js完成,于是找到了具体 ...

  2. 实现CA证书创建及客户端申请证书

    author:JevonWei 版权声明:原创作品 CA证书的相关文件路径 openssl配置文件/etc/pki/tls/openssl.cnf /etc/pki/tls/openssl.cnf C ...

  3. 极化码的matlab仿真(1)——参数设置

    根据老师的安排,对于极化码的了解从仿真开始. 仿真的手段有很多种.可以利用C,C++,matlab等进行仿真的实现.其中matlab由于具有强大的函数库,和壮观的矩阵运算能力,被(我们老师课题组)看中 ...

  4. Visual Studio2017数据库架构比较

    一.前言 开发的时候在测试服务器上和线网服务器上面都有我们的数据库,当我们在线网上面修改或者新增一些字段后,线网的数据库也需要更新,这个时候根据表的修改记录,然后在线网上面一个一个增加修改很浪费效率而 ...

  5. 大型网站的 HTTPS 实践(四)——协议层以外的实践

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt390 1 前言 网上介绍 https 的文章并不多,更鲜有分享在大型互联网站 ...

  6. 学会数据库读写分离、分表分库——用Mycat,这一篇就够了!

    系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一 ...

  7. 集美大学网络1413第十三次作业成绩(团队八) -- 第二次项目冲刺(Beta阶段)

    题目: 团队作业8--第二次项目冲刺(Beta阶段) 团队作业8-成绩:  团队/分值 新加入成员 角色 技术特点 改善的功能. 原因. bug 新增功能. 方法. 如何实现 团队分工改进. 原因 改 ...

  8. 201521123031 《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  9. 201521123035《Java程序设计》第五周学习总结

    1. 本章学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 接口是一种特殊的抽象类,是对行为的抽象,它不能使用new进行实例化,接口中可以包 ...

  10. 201521123047 《Java学习笔记》第二周学习总结

    1. 本周学习总结 -知道并了解到浮点数的误差关系,懂得运java.math.BigDecimal来进行浮点数的精确计算 -对于"="与"=="的区分 -字符串 ...