C++ builder :关键入门 AnsiString

转载 2012年03月23日 14:40:43
  其实是一个类(class),不过,它并不归属于VCL的框架,不是派生于TObject. 该类封装了C,C++里字符串的大多操作,并有所发展。方便了C++程序员在程序中使用字符串。下面挑典型和重要的说。  
   
  第一: 现在你不用(显式地)为字符串管理内存了:  
  AnsiString name = "Mike";  
  ShowMessage(name); //显示Mike  
  name = "张三";  
  ShowMessage(name); //显示张三  
  AnsiString name2 = name;  
  name = 李四";  
  ShowMessage(name);  
  ShowMessage(name2);  
  AnsiString twoName = name + name2;  
  ShowMessage(twoName);  
   
  上面其实说明了,AnsiString 重载了 = 和 + 操作符,让我们可以直接通过简单的=或+操作,来赋值,改变一个字符串。  
  如果不用Ansistring这样或类似的而在C,C++,同样的操作将是类似于(并不一定和上面完全一致的过程):  
  char* name = "Make";  
  ShowMessage(name);  
  name = new char[strlen("张三") + 1];  
  stcpy(name, "张三");  
  ShowMessage(name);  
  char* name2 = new char [strlen(name1)+1);  
  strcpy(name2,name);  
  delete[] name;  
  name = new char[strlem("李四")+1];  
  strcpy(name,"李四");  
  ShowMessage(name);  
  ShowMessage(name2);  
  char* twoName = new char [strlen(name) + strlen(name2) + 1)];  
  strcpy(twoName,name);  
  strcat(twoName,name2);  
  ShowMessage(twoName);  
  delete[] twoName;  
  delete[] name2;  
  delete[] name;  
   
  肯定可以看出后者在内存管理(初始分配,扩容,连接,释放)上的一堆琐事。当然,可以考虑用纯C的 malloc,realloc, free ,及 sprintf连减少一些操作,但在C++世界里,这样的内存管理会和使用new,new[] , delete,delete[]的代码在交接上产生问题。并不是C++程序员的首选。  
   
  可能还会说,我就是原意累点,可是直接写内存管理,会带来高效率啊。。这是不知量力。由于字符串管理在一个程序中的使用率太高了,事实上不管是VC的 CString, 还是STL的string,或者是C#的string,及我们这里的AnsiString,统统采用内存池,及“realloc on modify(在修改时才生分配内存)”等技术,可谓既提高了连续内存使用率,又提高了运行速度,这类高级功能,不是一般你我有精力甚至能力去实现。  
   
  第二,小心,AnsiString 带有Pascal风格。  
  AnsiString这个类也重载 [] 操作符 ,用于得到字串中指定的字符,可是,虽然AnsiString纯是用C++写成,但它是为了实现Object Pascal内置类型string,所以必须和Object Pascal保持兼容,所以,它的下标也是从1开始:  
  AnsiString pascal = "Pascal";  
  char c = pascal[1]; // c 是 'P' :(  
   
  第三,可以得到C风格的字符串。  
  Windows在编程接口上还是非面向对象,(等.Net完全取代后,就是了) 它的API还得用到很多的C风格的字符串(上面我们举例的那个);再者,C++既然说完全兼容C,那我们难免有时还会喜欢用用C的函数库。  
  AnsiString s = "123456";  
  int len = strlen(s.c_str());  
  没错, c_str() 这个成员函数返回的是一个 const char* 常量字符串指针。 因为是const的,所以用在类似strlen()这样仅要求是const char* 的函数还算方便,如果你想安全一点,或者人家函数指定就不能是const ,那你只好复制走:  
  AnsiString s = "123456";  
  char* tmp = new char[7];  
  strcpy(tmp, s.c_str()); //复制  
  然后对tmp爱干嘛干嘛去。  
   
  第四,它有好多字符串操作成员函数,并一般都有对应的同名全局函数。  
  比如取长度:  
  AnsiString s = "Hello!";  
  int len = s.Length(); //求长度  
  但你也可以这样:  
  int len = Length(s);  
  或例如求子串:  
  string subString = s.SubString(2,3);  
  ShowMessage(subString) // "ell"  
  同样用个全局的SubString(s,2,3);  
  注意了,索引从1开始。  
   
  第五,如果要用空串,最好不用 "";  
  而是:  
  AnsiString emptyStr = *NullStr;  
   
  第六,作为对 printf ,sprintf,格式函数的代替,请有Format函数。  
  AnsiString fmtStr = Format("我叫%s,今天是%d年%02d月%02日,我长%d岁了",  
  ARRAYOFCONST (( "南郁",2004,4,21,1)) );  
  ARRAYOFCONST这个宏,及Foramt格式串指令请看帮助。记得ARRAYOFCONST一定要带双层括号,如果你不喜欢用这个鬼宏,你可以另想办法。  
   
  第七,String就是AnsiString.  
  typedef AnsiString String;  
   
  第八,在VCL,几乎所有字串都是AnsiString。若是属性,则有要求, += 的重载对属性不保证一定起作用。  
   
  Form1->Caption = "窗口标题"; //OK  
  Form1->Caption += " - 世界你好"; //Err  
  Form1->Caption = Form1->Caption + " - 世界你好"; //OK  
   
  同样的事情发生 >>(移出) 或 << (移入) 重载上。如字符:  
  this->Font->Style >> fsBold; //不行的

网上转的,其实ansiString看看help应该比较容易懂

AnsiString和String的区别、使用

本文转自:http://www.bianceng.cn/c/index.htm16.C/C++语言在CB中的一些特定用法  2)AnsiString是从Delphi中引进来的吗?  答:CB的核心组件...
  • guolonghui
  • guolonghui
  • 2010年10月13日 09:43
  • 18801

C++ Builder AnsiString 类

AnsiString类 C++ Builder AnsiString 类介绍和使用 介绍AnsiString类之前,先要介绍一些背景知识。VCL大量利用Pascal长字串数据类型,几乎所有...
  • binnygoal
  • binnygoal
  • 2011年06月02日 10:55
  • 6699

c++builder字符串使用

AnsiString temp = "Update Image process:1%"; AnsiString temp2 = temp.SubString(22,4); ...
  • lz465350
  • lz465350
  • 2014年11月06日 14:38
  • 1017

进一步了解String

今天看到了你真的了解.NET中的String吗? 的文章,写的很不错,对string不错的说明,但是有几点我想补充一下,一旦你的string在堆中创建后,其在内存中都是以const存在,任何的修改都会...
  • lixianhuei
  • lixianhuei
  • 2006年01月05日 08:43
  • 899

字符串

String对象字符串是不可变的。String类中每个看起来会修改String值的方法,实际上都是创建一个全新String对象。而StringBuilder类是可变的,当对字符串操作时不会重新创建新的...
  • baidu_34051779
  • baidu_34051779
  • 2017年02月27日 19:54
  • 71

c++ builder 中 char 和 AnsiString字符串对比 效率慢的解决办法

在以往的c++开发经验中 我不太喜欢在结构体中直接使用AnsiString 类。 因为涉及到内存复制类或者指针引用是常常会出现莫名奇妙的问题。并且可移值性差。在以往需要处理字符串对比时常常这样写cha...
  • cmlxiaogeaaa
  • cmlxiaogeaaa
  • 2016年10月06日 16:24
  • 1063

C++ Builder string相互转换

1. char*->string (1)直接转换 const char* nodename; string temp = nodename; string temp2(nodename); 2. ...
  • tody_guo
  • tody_guo
  • 2016年03月05日 20:05
  • 2939

梦断代码--一个程序员的自白(八)

本文谢绝转载 http://www.weibo.com/0x2b 因为最初我只是想证明我的那个可扩展的类型系统,因此我给ADPLite改了个名字,叫“息壤”,喻意类型系统会像息壤一样,能够生长。...
  • wingfiring
  • wingfiring
  • 2012年10月18日 14:30
  • 3830

字符串压缩

题目要求: /**  * 通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。 压缩规则:  * 1、仅压缩连续...
  • uxiaolang
  • uxiaolang
  • 2015年09月02日 16:04
  • 426

C++ Builder 字符串时间格式转换为TDateTime方法

TDateTime强制转换字符串  AnsiString sDate;  int second,minute,hour,day,month,year; second=10; minute=10; ho...
  • langshao22
  • langshao22
  • 2016年10月31日 10:29
  • 1259
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ builder :关键入门 AnsiString
举报原因:
原因补充:

(最多只允许输入30个字)