当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

AnsiString类

介绍ansistring类之前,先要介绍一些背景知识。vcl大量利用pascal长字串数据类型,几乎所有基于文本的vcl属性都采用pascal长字串。例如,text、name和caption属性都是pascal长字串属性。vcl的许多构件方法和事件处理函数也采用pascal长字串。
关于pascal长字串数据类型要注意两点。第一,pascal长字串是真正的语言数据类型,而不象c/c++中一样只是个字符数组。第二,c++内部没有pascal长字串的对等类型。由于vcl大量使用pascal长字串,而c++ builder使用pascal vcl,所以borland生成一个c++类来近似pascal长字串,这个类就是ansistring类,可以代替pascal长字串。
ansistring类的类名不易理解,你要在sysdefs.h中采用如下语句:
typedef ansistring string;
这样就可以在声明ansistring类的实例时用名称string而不用正式类名ansistring类:
string s = \"this is a test\";
由于string是ansistring类的别名,所以不必在c++ builder程序中再用ansistring类名(当然,还可以这么用)。为了清晰起见,我在文本中使用ansistring类名,而在代码例子中使用缩略形式string。
ansistring类是功能很强的字串类。ansistring类构造器可以从char、char*、int或double生成ansistring类对象。这些构造器很容易将直接字串赋予ansistring类并将整数或浮点数变成字串。下列例子显式或隐式使用ansistring类构造器:
string floatstring = 127.123;
string anotherfloatstring(0.999);
string intstring = 49;
string charstring = \'a\';
labell>caption = \"this is a test\";
double d = 3.14 * 20;
edit1>text = d;
也许你对细节不感兴趣,但需要直接赋值时,c++编译器在后台采用相应的ansistring构造器。以下列语句为例:
string s = 127.123; // create an ansistring from a double
编译器在后台产生如下语句:
string s = string((double)127.123;
因此,ansistring构造器在直接赋值时要进行换算。上述代码可以工作的另一原因是ansistring类重载了赋值操作符(=)。ansistring还重载了接合(+操作符)和测试等式(==操作符)等操作符,从而简化工作。ansistring类和其它c++类一样,有许多使字串操作更方便。
下表列出几个最常用的ansistring方法,如果需要ansistring方法的完整清单,请看c++ builder联机帮助。
c_str 返回字串的数据的指针(char*)
delete 删除字串的一部分
insert 在现有字串的指定位置插入文本
length 返回字串长度,不包括终止null
lowercase 将字串变成小写
pos 返回搜索字串在字串中的位置
substring 返回字串中从指定位置开始、指定长度的子串
todouble 将字串变成浮点数,如果无法将字串变成浮点数,则扔出异常
toint 将字串变成整数,如果无法将字串变成整数,则扔出异常
tointdef 将字串变成整数并在不能换算时提供缺省值而不扔出异常
trim 删除字串前后的空格
uppercase 将字串变成大写
其中几个方法需要特别说明。一个是c_str()方法,这个奇怪的方法名用于要取得ansistring的字串缓冲区指针时。为什么要这么干呢?有些windows api函数需要char*参数。ansistring是个类,不能直接将ansistring传递给需要字符数组指针的函数。例如,如果使用windows api函数drawtext(),则要用如下代码:
rect r
rect(0,0,100,20);// first,the c waychar
buff[]=\"this is a test\";
drawtext(canvas>handle,buff,1,&r,dt_singleline);
// now the vcl way
string s =\"this is a test\";
drawtext(canvas>handle,s.c_str(),1,&r,dt_singleline);
drawtext()函数的第二个参数需要字串缓冲区指针,这就要靠c_str()方法提供。如果不理解,可以等以后再回头理解。
目前不必对drawtext()太费心。这个例子说明vcl将你从windowsapi函数隔离开,而又还能使用windows api函数。深入windows编程时,有时会需要windows api函数,这时windows api函数很有现成。
另一个ansistring方法是toint()。这个方法将字串变成整数。假设窗体上有个编辑构件要向用户取整数值,由于编辑构件只能放文本,所以需要将字串变成整数。方法如下:
int value = edit1>text.toint();
todouble()方法的用法也一样。注意,如果不能换算,这两个方法都会扔出异常。
有几个ansistring方法不是作用于字串本身,而是返回新的字串。以uppercase()方法为例,可以用下列代码将字串变成大写吗?
string filename = \"c:\\\\mystuff\\\\mydata.dat\";
filename.uppercase();
不可以,因为uppercase()方法返回新字串,而不是作用于字串本身。正确的方法如下:
filename= filename.uppercase();
使用ansistring方法前,先从联机帮助看看这些方法如何操作。另外,记住双反斜杠。另一个ansistring方法是我所不喜欢的,format()方法可以象sprintf()函数一样用变量建立字串。
sprintf()函数的例子:
char buff[20];
int x = 10 * 20;
sprintf(buff, \"the result is: %d\",x);
这个代码建立内容为\"the result is:200\"的字串。
这个工作也可以用ansistring方法format()完成:
string s;
int x = 10 * 20;
s = s.format( \"the result is: %d\",openarray(tvarrec,(x)));
够难看的。这个函数有其存在的原因,但我从来不用format()方法,一个原因是我记不住这古怪的语法,另一原因是sprintf()函数更方便。ansistring格式化的方法如下:
int x = 10 * 20;
char buff[20];
sprintf(buff, \"the result is: %d\",x);
string s= buff;
显然,这个方法并不优雅,但format()也好不到哪里,读者可以自选其中一个方法。
ansistring类还一个怪事值得一提。索引操作符([])可以引用字串的特定元素:
string s = \"hello world!\";
label1>caption = s[7];
这个代码将字符w赋予标题构件的caption属性。这里要指出的是,字串的第一个元素在数组索引1处,而不象其它c++数组一样在数组索引0处.基数为1的索引主要是为了与delphi兼容。这一次也许会让c++编程老手头痛一阵子.
相关内容
赞助商链接