字符串的操作 (一)字符串的运算和比较 由字符串的常量、变量和运算符组成的表达式称为字符串表达式,字符串运算符包括: +:连接运算符 例如:"Turbo"+" ![](static/image/smiley/default/titter.gif) ASCAL"的结果是"Turbo PASCAL" 若连接的结果字符串长度超过255,则被截成255个字符;若连接后的字符串存放在定义的字符串变量中,当其长度超过定义的字符串长度时,超过部份字符串被截断。 例如:var str1,str2,str3:string[8]; begin str1:="Turbo"; str2:=" ![](static/image/smiley/default/titter.gif) ASCAL"; str3:=str1+str2; end. 则str3的值为:"TurboPA" =、<>、<、<=、>、>=:关系运算符 两个字符串的比较规则为,从左到右按照ASCⅡ码值逐个比较,遇到ASCⅡ码不等时,规定ASCⅡ码值大的字符所在的字符串为大。 例如:"AB"<"AC"结果为真 "12"<"2"结果为真 " ![](static/image/smiley/default/titter.gif) ASCAL"=" ![](static/image/smiley/default/titter.gif) ASCAL" 结果为假 【例3】对给定的10个国家名,按其字母的顺序输出 程序如下: programex8_3; vari,j,k:integer; t:string[20]; cname:array[1..10]of string[20]; begin fori:=1 to 10 do readln(cname); fori:=1 to 9 do begin k:=i; forj:=i+1 to 10 do if cname[k]>cname[j] then k:=j; t:=cname;cname:=cname[k];cname[k]:=t; end; fori:=1 to 10 do writeln(cname); end. 分析:程序中,当执行到ifcname[k]>cname[j]时,自动将cname[k]串与cname[j]串中的每一个字符逐个比较,直至遇到不等而决定其大小。这种比较方式是计算机中字符串比较的一般方式。 三、字符串的函数和过程 TurboPascal提供了八个标准函数和标准过程,见下表,利用这些标准函数与标准过程,一些涉及到字符串的问题可以灵活解决。 函数和过程名 功 能 说 明 CONCAL(ST1,...,STN)将N个字符串连接起来 等效于ST1+...+ST2,是函数 COPY(S,M,N) 取S中第M个字符开始的N个字符 若M大于S的长度,则返回空串;否则,若M+N大于s的长度,则截断,是函数 LENGTH(S) 求s的动态的长度 返回值为整数,是函数 POS(SUB,S) 在S中找子串SUB 返回值为SUB在S中的位置,为byte型,是函数 UPCASE(CH) 将字母CH转换成大写字母 若CH不为小写字母,则不转换,是函数 INSERT(SOUR,S,M) 在S的第M个字符位置处插入子串SOUR 若返回串超过255,则截断,是过程 DELETE(S,M,N) 删除S中第M个字符开始的N个字符串 若M大于S的长度,则不删除;否则,若M+N大于S的长度,则删除到结尾,是过程 STR(X[:W[ ![](static/image/smiley/default/biggrin.gif) ]],S) 将整数或实数X转换成字符串S W和D是整型表达式,意义同带字宽的write语句,是过程 VAL(S,X,CODE) 将字符串S转换成整数或实数X 若S中有非法字符,则CODE存放非法字符在S中的下标;否则,CODE为零,CODE为整型,是过程 FILLCHAR(S,N,CH)给S填充N个相同的CH 用于初始化数组或字符串,N常用SIZEOF(S)代替,是过程 注:关于字符串的几点说明 ①空串表示为"",其长度为0,不等于含有一个空格的串" ",它的长度为1;如:A:="";就是将A字符串置空 ②FILLCHAR可以用于字符串变量和任何类型数组变量的初始化,比如: FILLCHAR(A,SIZEOF(A),0) 将整型数组A全置0 FILLCHAR(B,SIZEOF(B),TRUE) 将布尔型数组B全置0 FILLCHAR(C,SIZEOF(C),"A") 将整型字符串C全置"A" 【例4】 校对输入日期(以标准英语日期,月/日/年)的正确性,若输入正确则以年.月.日的方式输出。 程序如下: program ex8_4; const max:array[1..12] of byte =(31,29,31,30,31,30,31,31,30,31,30,31); var st:string; p,w,y,m,d:integer; procedure err; begin write("Input Error!"); readln; halt; end; procedure init(var x:integer); begin p:=pos("/",st); if(p=0) or (p=1) or (p>3) then err; val(copy(st,1,p-1),x,w); ifw<>0 then err; delete(st,1,p); end; begin write("The Date is :"); readln(st); init(m); init(d); val(st,y,w); ifnot (length(st)<>4) or (w<>0) or (m>12) or (d>max[m]) thenerr; if(m=2) and (d=29) then if y mod 100=0 then begin ify mod 400<>0 then err; end else if y mod 4<>0 then err; write("Date : ",y,".",m,".",d); readln; end.
|