var ss:tstringlist; s:string; begin s:='AAA|BBB|CCC|DDD'; ss:=TStringlist.Create; ss.Delimiter:='|'; ss.DelimitedText:=s; for i:=0 to ss.count-1 do begin showmessage(ss.string[i]); end;
function ExtractStrings(Separators, WhiteSpace: TSysCharSet; Content: PChar; Strings: TStrings): Integer;
ExtractStrings(['|'], [], PChar(s), ss);
一、给一楼改一下:var ss:tstringlist; s:string; i : integer; begin s:='AAA|BBB|CCC|DDD'; ss:=TStringlist.Create; ss.Delimiter:='|'; ss.DelimitedText:=s; for i:=0 to ss.count-1 do begin showmessage(ss[i]); end; SS.Free; end;二、用StringReplace函数var S : string; SS : TStringList; I : integer; begin S := 'AAA|BBB|CCC|DDD'; SS := TStringList.Create; SS.Text := StringReplace(S, '|', #10, [rfReplaceAll]); for i:=0 to ss.count-1 do begin showmessage(ss[i]); end; SS.Free; end;
本想在S所占堆内存里的'|'处插入17个字节,把字串长度、NULL、分配大小、引用计数等信息写入,然后直接用这块内存作为array of string的各元素目标地址,无奈能力有限,太复杂只有放弃,改为下面这种人人都会的方式:把字串分解到字串数组里去:var S : string; SArray : array of string; I, J, K, L : integer; begin S := 'AAA|BBB|CCC|DDD'; L := 0; J := 1; K := 0; for I := 1 to Length(S)+1 do if (S[I] <> '|') and (I <= Length(S)) then Inc(K) else begin Inc(L); SetLength(SArray, L); SArray[L-1] := Copy(S, J, K); K := 0; J := I+1; end; for I := Low(SArray) to High(SArray) do Showmessage(SArray[I]); end;
在看下面的程序前,首先看声明:一、声明1:实用中还是TStringList分割保存最方便。前面已用TStringList实现。并且前面的保存为“字符串数组”的方法也是可用的。 二、声明2:下面的程序只是编译运行时凑巧没有出错而已。^_^ 三、声明3:可以提意见,但不要打击我 ^_^ 四、声明4:详细的注释,请访问:http://rabbitfox.blog.sohu.com/38253374.html//另类建立String对象的探索 procedure TForm1.Button1Click(Sender: TObject); { 程序可能隐藏巨大的BUG,特此声明 } var S : string; //这是欲转换的字符串 Buf : array of Byte; //因为不便对常量空间进行下面的操作,需要这样一块内存 SArray : array of string; //这是我们要得到的字符串数组 PW : ^LongInt; L, I, J, K : integer; begin S := 'ABC|DEFG|HI|JKL|MN|OP'; L := Length(S)+16; SetLength(Buf, L); Move( S[1], Buf[16], L-16); PW := @Buf[0]; K := 0; J := 0; I := 16; while I <= L do begin if (Buf[I] <> Byte('|')) and (I<>L) then Inc(K) else begin PW^ := 0;//这4个字节应该写什么?暂全充0 (不明) Inc(PW); PW^ := K+17; //分配大小。K+17正确吗?(不明) Inc(PW); PW^ := 0;//引用计数。此时没有被引用,写0对吗?(不明) Inc(PW); PW^ := K;//字串长度 (明确) Buf[I] := 0;//NULL终止符 (明确) Inc(J); //动态改变结果字符串数组的大小 SetLength(SArray, J); integer(SArray[J-1]) := integer(@Buf[I-K]);//使字串数组的这个元素指向当前“子”串 if L<>I then begin L := L+16; SetLength(Buf, L); Move(Buf[I+1], Buf[I+17], L-I-17); PW := @Buf[I+1]; K := 0; I := I + 16; end; end; Inc(I); end; L := L + 1; SetLength(Buf, L); Buf[L-1] := 0; for I := Low(SArray) to High(SArray) do //看一下我们得到的字符串数组(只能看一看了,引用就错。哈哈) showmessage(SArray[I]); end;(过往高人不要笑话我。 ^_^ )
s:string;
begin
s:='AAA|BBB|CCC|DDD';
ss:=TStringlist.Create;
ss.Delimiter:='|';
ss.DelimitedText:=s;
for i:=0 to ss.count-1 do
begin
showmessage(ss.string[i]);
end;
s:string;
i : integer;
begin
s:='AAA|BBB|CCC|DDD';
ss:=TStringlist.Create;
ss.Delimiter:='|';
ss.DelimitedText:=s;
for i:=0 to ss.count-1 do
begin
showmessage(ss[i]);
end;
SS.Free;
end;二、用StringReplace函数var
S : string;
SS : TStringList;
I : integer;
begin
S := 'AAA|BBB|CCC|DDD';
SS := TStringList.Create;
SS.Text := StringReplace(S, '|', #10, [rfReplaceAll]);
for i:=0 to ss.count-1 do
begin
showmessage(ss[i]);
end;
SS.Free;
end;
S : string;
SArray : array of string;
I, J, K, L : integer;
begin
S := 'AAA|BBB|CCC|DDD';
L := 0;
J := 1;
K := 0;
for I := 1 to Length(S)+1 do
if (S[I] <> '|') and (I <= Length(S)) then Inc(K) else
begin
Inc(L);
SetLength(SArray, L);
SArray[L-1] := Copy(S, J, K);
K := 0;
J := I+1;
end;
for I := Low(SArray) to High(SArray) do
Showmessage(SArray[I]);
end;
二、声明2:下面的程序只是编译运行时凑巧没有出错而已。^_^
三、声明3:可以提意见,但不要打击我 ^_^
四、声明4:详细的注释,请访问:http://rabbitfox.blog.sohu.com/38253374.html//另类建立String对象的探索
procedure TForm1.Button1Click(Sender: TObject);
{ 程序可能隐藏巨大的BUG,特此声明 }
var
S : string; //这是欲转换的字符串
Buf : array of Byte; //因为不便对常量空间进行下面的操作,需要这样一块内存
SArray : array of string; //这是我们要得到的字符串数组
PW : ^LongInt;
L, I, J, K : integer;
begin
S := 'ABC|DEFG|HI|JKL|MN|OP';
L := Length(S)+16;
SetLength(Buf, L);
Move( S[1], Buf[16], L-16);
PW := @Buf[0];
K := 0;
J := 0;
I := 16;
while I <= L do
begin
if (Buf[I] <> Byte('|')) and (I<>L) then Inc(K) else
begin
PW^ := 0;//这4个字节应该写什么?暂全充0 (不明)
Inc(PW);
PW^ := K+17; //分配大小。K+17正确吗?(不明)
Inc(PW);
PW^ := 0;//引用计数。此时没有被引用,写0对吗?(不明)
Inc(PW);
PW^ := K;//字串长度 (明确)
Buf[I] := 0;//NULL终止符 (明确) Inc(J); //动态改变结果字符串数组的大小
SetLength(SArray, J);
integer(SArray[J-1]) := integer(@Buf[I-K]);//使字串数组的这个元素指向当前“子”串 if L<>I then
begin
L := L+16;
SetLength(Buf, L);
Move(Buf[I+1], Buf[I+17], L-I-17);
PW := @Buf[I+1];
K := 0;
I := I + 16;
end;
end;
Inc(I);
end;
L := L + 1;
SetLength(Buf, L);
Buf[L-1] := 0;
for I := Low(SArray) to High(SArray) do //看一下我们得到的字符串数组(只能看一看了,引用就错。哈哈)
showmessage(SArray[I]);
end;(过往高人不要笑话我。 ^_^ )
反正我心里那是相当的没底。
这个是在数组JS上用的,