其实是一个类(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 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应该比较容易懂