BCB中AnsiString类方法小结

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, 为当前字符串转化为题写/大写的结果。

  1. 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’;

运作结果C++虽是我们的预期了,为什么加了句strTest[1]=’x’;就”正常”了呢?很显然AnsiString为了我们率先只问题遭的频率问题采取
了copy on
write技术,也便是不过读共享,写时拷贝。这样只有在对象要转移该里面数据的值经常才举行同客祥和的拷贝然后以和谐之正片中展开改动(就种植技术于操作系统中
被广大应用)。同时以靶析构时如引用计数大于0,数据为不见面被去除,它保证数据的实惠。这样回去AnsiString变量的函数也就算不曾严重的频率
问题了。