【转】Delphi中字符串的处理

原文来自: 【100脚本网 http://www.pc100.net/ 】

一、几个字符串处理的基本函数

  a)子串定位——获取子串在原字串中的位置(不是数组下标,而是第几个)

1 function pos(‘子串‘,‘原字符串‘):integer

说明:当有中文时,最好这样用:pos(‘子串‘,wideString(‘原字符串‘)),这样可以避免前一个汉字的后半部分和后一个汉字的前半部分 也恰好能构成一个汉字时出现问题。

  b)子串截取——拷贝出原字符串中的部分子串(Index不是数组下标,而是第几个)

1 function Copy(S; Index, Count: Integer):string

   
说明:其实该函数也可对字符数组进行拷贝操作,只不过“源数据”和“返回数据”都是字符数组

function Copy(S; Index, Count: Integer):array

附:另几个更有针对性的截取操作

1)截取源字符串左端一定长度位数:StrUtils.pas
                 function LeftStr(Const Str:String;Size:word):string;
           2)截取源字符串中间一定长度位数:StrUtils.pas
                 function MidStr(Const Str:String;From,Size:word):string;
           3)截取源字符串右端一定长度位数:StrUtils.pas
                 function RightStr(Const Str:String;Size:word):string;

c)字符串分割——利用分割符将原串分割成若干个子串

1 strList:=TStringList.create;
2 strList.delimiter:=‘|‘;
3 strList.delimitedText:=‘待|分|割|的|字|符|串‘;

说明:  这样操作之后,分割得到的每条元素都分别存于strList中

d)长度计算——计算字符串的长度

function Length(S): Integer;

  

   e)长度设定——人为指定字符串的长度

procedure SetLength(var S; NewLength: Integer);

    字符串显示时,会根据设置的长度值而不是后面的结束符#0,来决定显示的“字符长度”

   f)字符串填充

var
  SourceString,ResultString:string;
 begin
  SourceString:=‘ABCD‘;
  //ResultString为8位,不足高位用‘0’填充
  ResultString:=StringOfChar(‘0‘,8-length(SourceString))+sourcestring;
  ShowMessage(ResultString);//最终结果为‘0000ABCD’
 end;

说明:对位数不足的字符串,在高位置以特定的字符进行填充

g)字符串中添加分隔符(自定义函数)

function DelimiterInsert(Const s: String; Const sCut: String): String;
var
  i: Integer;
begin
  i:= 1 ;
  while i < length(s) do
  begin
    if i = 1 then
      Result := copy(s, i, 2)
    else
      Result := Result + sCut+ Copy(s, i, 2);
    i := i + 2;
  end;
end;

测试:

var
  sourceStr,destinateStr:string;
begin
  sourceStr:=‘abcdefgh‘;
  destinateStr := DelimiterInsert(sourceStr, ‘-‘);//每两个字符之间加上“-”

  ShowMessage(destinateStr);
end;

运行结果(略):

  h)单引号

     aa := ‘aaa‘‘‘ ;那么aa的结果就是aaa‘ 
    实际上就是两个单引号表示一个单引号  bb:=‘bb‘‘bb‘;bb的结果为 bb‘bb

 i)ascii码转换成字符

var
  ss:string;
begin
  ss:=char(65)+char(66);
  ShowMessage(ss);
end;

运行结果:

   j)字符替换

var
  ss:string;
begin
  ss:=‘aaabbbccc‘;
  ss:=StringReplace(ss, ‘b‘, ‘m‘, [rfReplaceAll]);
  ShowMessage(ss);
end;

运行结果:

 

 

注: 更全面的字符串处理函数,可参考:

a)http://ideasforjava.javaeye.com/blog/850360
                                          b)Delphi帮助文档,Help—>Delphi Help 下strUtils 

二、string,pchar,字符数组三者之间的相互转换  

a)String类型在内存中的分配

    

       说明:1)结束符#0其实只是为了兼容pchar类型,实际输出字符串时,是根据“字符串长度”中存储的数值,而不是结束符#0,代码如下:

varSrcString:string;begin   SrcString:=‘12345‘;//此时长度为5   ShowMessage(‘原始字符串为:‘+SrcString);   SrcString:=SrcString+‘AddStr‘;   //此时字符串为“12345AddStr”,长度也会自动修改为11   showmessage(‘追加之后的字符串:‘+SrcString); //显示为:“12345AddStr”   SetLength(SrcString,3);       //字符串长度人为设置为3,实际长度应该是11   ShowMessage(‘人为设置长度后字符串为:‘+SrcString);//根据存储的长度值显 示,而非结束符#0,最终输出‘123’end;

 

2)引用计数的作用是:当指向该堆空间的指针个数为零时,编译器自动释放堆内存,而不需

                                           要手动释放

               3)采用copy on write机制,以提高内存空间的利用率

      附:什么是copy on write机制?

多个引用指向同一块内存地址。当其中的某个引用发生写操作时,重新拷贝一份到其他内存中,同时

原引用计数减1。这样做是为了提高内存的利用率。

缺陷:string类型作为参数时,尽管一开始“临时引用”和“原始引用”都指向堆中的同一块内存,

当在调用到的函数体内,对“临时引用”指向的内存块进行写操作时,实际上会把该内存块

的内容拷贝出来并结合具体的操作,生成调用者需要的字符串,存入新开辟的一块堆内存中,

此时“原始引用”指向的那块内存块的内容并没有发生改变,这也是为什么无法用string类型

作为输出参数传递函数返回值(但可以用作输入参数),而是使用PChar类型作为输出参数

传递函数返回值

                      被调用的以string类型作为“输出参数”的函数:

procedure TForm1.StringTypeAsOutputParam(SourceStr:string);begin   SourceStr:=SourceStr+‘bbbbb‘;   showmessage(‘修改之后的字符串为:‘+SourceStr);//显示为:aaaaabbbbbbend;

                      调用该函数:

var  mySourceStr:string;begin  mySourceStr:=‘aaaaa‘;  showmessage(‘原始字符串为:‘+mySourceStr); //显示为:‘aaaaa‘  StringTypeAsOutputParam(mySourceStr); //将string类型作为输出参数传入  showmessage(‘调用函数之后的字符串为:‘+mySourceStr);//依然显示为:‘aaaaa‘end;

b)String与Pchar

两者兼容,可直接进行“类型强转”

var
     myString:string;
   myPchar:PChar;
  begin
    myString:=‘ABCDEFG‘;
    ShowMessage(‘转换之前的字符串为:‘+myString); //此时字符串为 ‘ABCDEF’
    myPchar:=PChar(myString);
    mystring:=string(myPchar);
    ShowMessage(‘连续转换后的字符串为:‘+myString); //此时字符串仍为 ‘ABCDEF’
  end;

c)字符数组与Pchar

1)字符数组下标从0开始

 

2)字符数组下标从1开始

var
  myArrayChar:array[1..10] of Char;
  myPchar:PChar;
begin
  myPchar:=PChar(‘ABCDEF‘);
  StrCopy(@myArrayChar,myPchar); // 也可使用 StrPCopy(@myArrayChar,‘ABCDEF‘);
  ShowMessage(myArrayChar[1]); //输出值为 ‘A’ 注:此时若以myArrayChar[0]来访问会无法通过编译
  myArrayChar[1]:=‘1‘;
  myPchar:=PChar(@myArrayChar);
  ShowMessage(string(myPchar)); //整个字符串为‘1BCDEF’
end;

   

d)string与字符数组 :需要借助pchar类型过渡

var
  myString:string;
  myArrayChar:array[1..10] of Char;
begin
  myString:=‘ABCDEF‘;
  StrCopy(@myArraychar,PChar(myString));//也可以使用 StrPCopy(@myArraychar,myString);
  myArrayChar[1]:=‘1‘;
  myString:=string(PChar(@myArrayChar));
  ShowMessage(myString); //转换后的值为‘1BCDEF’
end;

注: StrCopy与StrPCopy的区别

     参数类型:    StrCopy(pchar类型,pchar类型);

StrPCopy(pchar类型,string类型);

e)推荐用法:

1)字符串拷贝时

StrPCopy(pchar类型,string类型);

2)需要将字符串作为“输出参数”时

使用PChar类型

3)定义字符数组时

charArray:array[0..n] of char ;//下标尽可能从0开始,而不是从1开始

f)string与widestring 

string: Ansi字符集
   widestring: Unicode字符集

时间: 2024-07-29 07:44:24

【转】Delphi中字符串的处理的相关文章

Delphi 中 函数参数中的 const 修饰符的本质以及注意事项

来自:http://blog.csdn.net/farrellcn/article/details/9096787 ------------------------------------------------------------------------------ 很多书籍中说函数参数如果是String类型的,如果在函数内部不改变参数的值,使用 const 修饰符会加快程序的执行速度,至于如何加快的?有的人说是因为 const 函数保证了参数字符串不会被复制.以前也没有对这个问题深入研究

关于Delphi中的字符串的详细分析

关于Delphi中的字符串的详细分析 只是浅浅的解析下,让大家可以快速的理解字符串. 其中的所有代码均在Delphi7下测试通过. Delphi 4,5,6,7中有字符串类型包括了: 短字符串(Short String) 长字符串(Long String) 宽字符串(Wide String) 零结尾字符串(Null-Terminated String).PChar和字符数组 1.短字符串(Short String) 固 定长度,最大字符数个数为255,短字符串也成为长度字节(Length-byt

关于Delphi中的字符串的浅析(瓢虫大作,里面有内存错误的举例)

关于Delphi中的字符串的浅析 只是浅浅的解析下,让大家可以快速的理解字符串. 其中的所有代码均在Delphi7下测试通过. Delphi 4,5,6,7中有字符串类型包括了: 短字符串(Short String) 长字符串(Long String) 宽字符串(Wide String) 零结尾字符串(Null-Terminated String).PChar和字符数组 1.短字符串(Short String) 固定长度,最大字符数个数为255,短字符串也成为长度字节(Length-byte)字

Delphi中怎样将字符串按给定字符分隔(类似split函数的功能)

Delphi中怎样将字符串按给定字符分隔(类似split函数的功能) 分类:            Delphi2007-05-16 11:094911人阅读评论(2)收藏举报 delphiintegerstringbutton文本编辑function 今天偶尔要做的Delphi程序,其中涉及到了字符串处理,里面有一个功能类似于VB里的split()函数的功能,于是查了很久才查到些资料,现将这些资料整理一下,方便大家. 首先是一个网友自己编的函数.实现了和split()函数的功能. unit U

(转)Delphi 中的字符串

一.Delphi 2009 之前的字符串(不支持 Unicode): Delphi 2009 之前的字符串分为 3 种:ShortString.AnsiString.WideString. [ShortString] ShortString 是一种比较古老的 Pascal 字符串格式,它最多只能容纳 255 个字节的字符.当我们声明一个 ShortString 类型的变量时,Delphi 会自动申请 256 个字节的内存空间给该变量,其中第一个字节用来存放字符串的长度,后面的 255 个字节用来

比较C/C++和Delphi中的字符串和字符数组(数组和动态分配内存的情况)

本文所讲解的只是从其中一个方面来看待进行的总结,所以有必要结合<Delphi字符串与字符数组之间的转换(初始化的重要性)>等文章进行更全面的了解,会从更多方面来理解字符串.内存.类型转换 C/C++中的字符串.字符数组.字符指针分配的内存空间 我们知道在C/C++中,我们可以这样理解字符串和字符数组 1)字符串,就是一个以 '\0' 结尾的字符数组 2)字符数组,包括字符串,但是不一定要以 '\0' 结尾,如果不是以'\0' 结尾,那么就不能当做字符串使用 在C/C++中,使用字符串可以通过数

Delphi 中Format的字符串格式化使用说明(转)

源:Delphi 中Format的字符串格式化使用说明(转) 一.Format函数的用法 Format是一个很常用,却又似乎很烦的方法,本人试图对这个方法的帮助进行一些翻译,让它有一个完整的概貌,以供大家查询之用: 首先看它的声明: function Format(const Format: string; const Args: array of const): string; overload; 事实上Format方法有两个种形式,另外一种是三个参数的,主要区别在于它是线程安全的,但并不多用

Delphi中stringlist分割字符串的用法

Delphi中stringlist分割字符串的用法 TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 1.CommaText 2.Delimiter &DelimitedText 3.Names &Values &ValueFromIndex 先看第一个:CommaText.怎么用呢? const constr :String = 'aaa,bbb,ccc,ddd'; var strs :TStrin

Delphi中分隔字符串函数的使用

下面介绍Delphi自带的字符串分割函数,根据你的需要来使用. 1.ExtractStrings function ExtractStrings(Separators, WhiteSpace: TSysCharSet; Content: PChar; Strings: TStrings): Integer; 第一个参数是分隔符,可以是多个,例如 [';',',',':'] 可以按分号.逗号.分号来同时分割. 第二个参数是开头被忽略的字符,例如['<','>',''],被分割出的字符,如果开头有