首页  编辑  

字符串

Tags: /超级猛料/String.字符串处理/   Date Created:
* AnsiString 这是 Pascal 缺省的字符串类型,它由 AnsiChar 字符组成,其长度没有限制,同时与null 结束的字符串相兼容。
* ShortString 保留该类型是为了向后兼容Delphi 1.0 ,它的长度限制在 255 个字符内。
* WideString 功能上类似于AnsiString,但它是由 WideChar 字符组成的。
* PChar 指向 null 结束的 Char 字符串的指针,类似于 C 的char * 或 lpstr 类型。
* PAnsiChar 指向 null 结束的 AnsiChar 字符串的指针。
* PWideChar 指向 null 结束的 WideChar 字符串的指针。
缺省情况下,如果用如下的代码来定义字符串,编译器认为是 AnsiString 字符串:
var
 S:string; //编译器认为S 的类型是 AnsiString
当然,能用编译开关 $H 来将 string 类型定义为 ShortString ,当 $H 编译开关的值为负时, string 变量
是 ShortString 类型;当$ H 编译开关的值为正时(缺省情况),字符串变量是 AnsiString 类型。
*********************
字符串string 字符数组与指向字符串的指针pchar的区别与联系
  这3者的基本概念相同,但有一些非常细微的差别,在编程时稍不注意就会出错,需高度重视。
  1、使用指向字符串的指针,如果不是以0结尾,运行时就会出现错误。为了避免这种错误,需要在字符串结尾人工加入0 即char(0),或用strpcopy函数在字符串结尾自动加0。
  例1: 指向字符串的指针,如果不是以0结尾,运行时会出现错误:
  {s[0]=3 s[1]='n' s[2]='e' s[3]='w'}
  var
    s:string;
          p:pchar;
  begin
    s:='new';
      label1.caption:=s; {new}
      label2.caption:=intTostr(integer(s[0]));{3是字符串的长度}
    p:=@s[1];{不是以0结尾,莫用pchar型指针}
     label3.caption:=strpas(p); {运行时出现错误}
  end;
  例2:在字符串结尾人工加入0即char(0),可使用指向字符串的指针。
  {s[0]=4 s[1]='n' s[2]='e' s[3]='w' s[4]=0;}
  {p-->'new'}
  var
           s:string;
           p:pchar;
  begin
    p:=@s[1];
    s:='new'+char(0); {以0结尾,可用pchar型指针}
    label1.caption:=strpas(p); {new}
    label2.caption:=s; {new}
    label3.caption:=intTostr(integer(s[0])); {4是字符串长度}
  end;
  例3: 用strpcopy函数赋值会在字符串s结尾自动加0。
  {s[0]=4 s[1]='n' s[2]='e' s[3]='w' s[4]=0;}
  {p-->'new'}
  var
          s:string;
          p:pchar;
  begin
   p:=@s[1];
     strpcopy(p,'new');{strpcopy函数在字符串结尾自动加0}
   label1.caption:=strpas(p);{new}
   label2.caption:=s;{new}
   label3.caption:=intTostr(integer(s[0]));{4}
  end;
  2、下标为0的字符串标识符存放的是字符串长度,字符型数组基本相当于字符串,但不能存放字符串长度。字符串可以用s:='a string'的形式赋值,但是字符型数组a[ ]不可直接用a:='array'的形式赋值,用此种形式会出现类型不匹配错误,可选用strpcopy函数赋值。
  例4: 字符型数组s[ ]相当于字符串,但没有存放字符串长度的位置。
  {s[1]='n' s[2]='e' s[3]='w' s[4]=0;}
  {p-->'new'}
  var
         s:array[1..10] of char;
         p:pchar;
  begin
    {s:='new'+char(0); error}{错误}
    p:=@s[1];
   {p:=@s; is not correct}
   strpcopy(p,'new');
   label1.caption:=strpas(p);{new}
   label2.caption:=s;{new}
   {label3.caption:=intTostr(integer(s[0]));}{不会出现4, 下标超出错误}
  end;
  例5:下标从0开始的字符数组s,s相当于@s[0]。
  { s[0]='n' s[1]='e' s[2]='w' s[3]=0;}{p-->'new'}
  var
         s:array[1..10] of char;
         p:pchar;
  begin
   {s:='new'+char(0); error}{错误}
     p:=s;
   {p:=@s[0] is also correct}
   strpcopy(p,'new');
   label1.caption:=strpas(p);{new}
   label2.caption:=s;{new}
   label3.caption:=s[0];{n}
   end;
  3、下标从0开始和从1开始的字符数组地址的表示方法也有细微不同:
  例6:下标从1开始的数组a 与下标从0开始的数组b 的比较。
  var
         a:array[1..10]of char;
         b:array[0..10]of char;
   {a:='1..10';}{type mismatch}
   {b:='0..10';}{type mismatch}
     begin
   strpcopy( b, 'from 0 to 10'); {正确 因为b即是@b[0] }
   strpcopy(@b[0], 'from 0 to 10'); {正确 与上个表达式结果相同}
   strpcopy(@a[1], 'from 1 to 10'); {正确 }
   strpcopy( a, 'from 1 to 10'); {类型匹配错误 因为a即是@a[0]}
   end;