Delphi Copy 函数 和 Pos函数
1、copy(a,b,c); -- 复制指定的字符串
- a:就是copy源,就是一个字符串,表示你将要从a里copy一些东西,
- b:从a中的第b位开始copy(包含第1位),
- c:copy从第b位开始后的c个字符,
示例:
1 2 | m:= 'the fellowship of the ring' s:=copy(m, 2 , 2 ); //s值为‘he’ |
函数原型:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | procedure _Copy { s : ShortString; index, count : Integer ) : ShortString} ; asm { ->EAX Source string } { EDX index } { ECX count } { [ESP+4] Pointer to result string } PUSH ESI PUSH EDI MOV ESI,EAX MOV EDI,[ESP+ 8 + 4 ] XOR EAX,EAX OR AL,[ESI] JZ @@srcEmpty { limit index to satisfy 1 <= index <= Length(src) } TEST EDX,EDX JLE @@smallInx CMP EDX,EAX JG @@bigInx @@cont1: { limit count to satisfy 0 <= count <= Length(src) - index + 1 } SUB EAX,EDX { calculate Length(src) - index + 1 } INC EAX TEST ECX,ECX JL @@smallCount CMP ECX,EAX JG @@bigCount @@cont2: ADD ESI,EDX MOV [EDI],CL INC EDI REP MOVSB JMP @@exit @@smallInx: MOV EDX, 1 JMP @@cont1 @@bigInx: { MOV EDX,EAX JMP @@cont1 } @@smallCount: XOR ECX,ECX JMP @@cont2 @@bigCount: MOV ECX,EAX JMP @@cont2 @@srcEmpty: MOV [EDI],AL @@exit: POP EDI POP ESI RET 4 end ; |
2、pos(a,b); -- 取出子串a,在父串b中第一次出现的位置;
示例:
1 | pos( 'b' , 'abcd' ); //返回结果 2; |
函数原型:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | procedure _Pos { substr : ShortString; s : ShortString ) : Integer} ; asm { ->EAX Pointer to substr } { EDX Pointer to string } { <-EAX Position of substr in s or 0 } PUSH EBX PUSH ESI PUSH EDI MOV ESI,EAX { Point ESI to substr } MOV EDI,EDX { Point EDI to s } XOR ECX,ECX { ECX = Length(s) } MOV CL,[EDI] INC EDI { Point EDI to first char of s } PUSH EDI { remember s position to calculate index } XOR EDX,EDX { EDX = Length(substr) } MOV DL,[ESI] INC ESI { Point ESI to first char of substr } DEC EDX { EDX = Length(substr) - 1 } JS @@fail { < 0 ? return 0 } MOV AL,[ESI] { AL = first char of substr } INC ESI { Point ESI to 2'nd char of substr } SUB ECX,EDX { #positions in s to look at } { = Length(s) - Length(substr) + 1 } JLE @@fail @@loop: REPNE SCASB JNE @@fail MOV EBX,ECX { save outer loop counter } PUSH ESI { save outer loop substr pointer } PUSH EDI { save outer loop s pointer } MOV ECX,EDX REPE CMPSB POP EDI { restore outer loop s pointer } POP ESI { restore outer loop substr pointer } JE @@found MOV ECX,EBX { restore outer loop counter } JMP @@loop @@fail: POP EDX { get rid of saved s pointer } XOR EAX,EAX JMP @@exit @@found: POP EDX { restore pointer to first char of s } MOV EAX,EDI { EDI points of char after match } SUB EAX,EDX { the difference is the correct index } @@exit: POP EDI POP ESI POP EBX end ; |
延伸查看PosEx函数
创建时间:2020.07.05 更新时间:2020.08.17 2022.05.06
博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你有所帮助,谢谢!
标签:
Delphi
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报