"0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|........"取出"|"之间的字符的算法!(100分)

  • 主题发起人 meng9999
  • 开始时间
M

meng9999

Unregistered / Unconfirmed
GUEST, unregistred user!
请问"0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|........"取出"|"之间的字符的算法!
字符串长度不定;要求取出其中的字符;本来是用c写的,但我想了大半天,想不出!
所以回到老地方,向各问请教!
可以用的语言c,delphi,java来写!,我的qq 66177364! meng9999@371.net!
谢谢大家!
 
"0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|........"
var
tmpstr:string;
i:integer;
strlst:tstrings;
begin
tmpstr:='0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|........';
if tmpstr[lenfth[tmpstr]<>'|' then tmpstr:=tmpstr+'|';
i:=pos('|',tmpstr);
strlst:=tstringlist.create;
try
while i<>-1 do
begin
strlst.add(copy(tmpstr,1,i -1 );
tmpstr:=copy(tmpstr,i+1,length(tmpstr);
i:=pos('|',tmpstr);
end
finally
strlst.free;
end;
 
我直接在浏览器上写的,可能有点问题,你将就着改改吧,至于在字符串后面加上'|'中为了
循环判断方便一点。
 
var
tmpStr : string;
begin
//连接所有字符串
tmpStr := '0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|........';
tmpStr := StringReplace(tmpStr, '|', '', [rfReplaceAll]);
Label1.Caption := tmpStr;

//两个'|'之间的串不在同一行
tmpStr := '0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|........';
tmpStr := StringReplace(tmpStr, '|', #13#10, [rfReplaceAll]);
Memo1.Text := tmpStr;
 
下面是VB代码,你试着改成delphi的吧
Public Pubstring() As String '分割字符串后保存的字符串数组
' #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
' 功能:ParseString:分割用","分开的字符串到公用数组
' 参数:
' StringToParse 要分割的字符串
' Delimiter 用来分隔字符的符号,默认是逗号
' 返回值:分割后的字符按顺序存储在动态数组中Pubstring
' #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
Public Sub ParseString(StringToParse As String, _
Optional Delimiter As String = ",")


Dim lngStartPos As Long
Dim lngNextPos As Long

Dim strtemp As String
Dim i As Integer

lngStartPos = 1
i = 1

Do



' Search the string
lngNextPos = InStr(lngStartPos, StringToParse, Delimiter)

If lngNextPos = 0 Then
' For when we get to the end of the file
strtemp = Mid$(StringToParse, lngStartPos, Len(StringToParse) - lngNextPos)
Else
strtemp = Mid$(StringToParse, lngStartPos, lngNextPos - lngStartPos)
End If

lngStartPos = lngNextPos + 1

ReDim Preserve Pubstring(i)
Pubstring(i - 1) = Trim(strtemp)
i = i + 1

DoEvents

Loop Until lngNextPos = 0
ReDim Preserve Pubstring(i - 1)
End Sub
 
//将字符串按指定的分隔符拆到列表中保存, ANull表示当两个分隔符没有间隔时
//使用ANull值加入到列表中, 返回分隔符没有间隔的次数
function SplitString(AString, ABreakSymbol, ANull: string;
AList: TStringList): Integer;
var
p1: Integer;
p2: Integer;
s: string;
ReplaceS: Char;
iCount: Integer;
begin
AList.Clear;
iCount := 0;
//临时的分隔符
ReplaceS := #5;
AString := AString + ABreakSymbol;
p1 := 1;
while Pos(ABreakSymbol, AString) > 0 do
begin
p2 := Pos(ABreakSymbol, AString);
AString[Pos(ABreakSymbol, AString)] := ReplaceS;
s := Copy(AString, p1, p2 - p1);
p1 := p2 + 1;
//利用两次出现BreakSymbol的位置取出相应的字符串
if (s = ABreakSymbol) or (s = '') then
begin
s := ANull;
Inc(iCount);
end;
AList.Add(s);
end;
Result := iCount;
end;
 
好人当到底吧
//将一个字符串列表中的字符串列表按分隔符合并为一个字符串返回,默认的分隔符为空
function UniteString(AList: TStrings; CompartSymbol: string = ''): string;
var
i: Integer;
s: string;
begin
for i := 0 to AList.Count - 1 do
s := s + AList.Strings + CompartSymbol;
Result := Copy(s, 1, Length(s) - Length(CompartSymbol));
end;
 
不要用写算法呀,直接有函数
ExtractStrings(['|'],['|'],’0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|........‘,strs);
strs是STRINGLIST,一切就OK了
 
Note: ExtractStrings does not add empty strings to the list.
如果是'0009||||afdsfds|dgfdg|gfgf||fgfg|',是不是就不会得到应该得到的字符串个数呢?
 
以上代码有vb的有delphi的,有哪位写出c的,我最终是用c的,但我一下写不出来;
只好想通过delphi的改为c的,但有java的也可以,语言无关性,希望大家一起来
学习!!
 
先定义一个字符串数组,长度随意,且每个值都为空,
根据字符串的长度确定循环次数,挨个判断字符串中
每个字符,如果字符不是|,字符一直写入数组中的
某一个数值中,如果是|,当前数组的数值结束,进入
下一个数组的值。
 
要处理好空字符串
 
1、获得第一个和第二个'|'位置,取出第一个字符;
2、截取
3、重复1和2
4、剩下的是最后一个(如果不为空的话)
 
谢谢天真,我刚准备贴代码啊。
ExtractStrings
 
procedure TForm1.Button8Click(Sender: TObject);
var
temp : String ;
a_Stringlist :TStringList;
i:integer;
begin
a_Stringlist:=TStringList.Create;
temp:='0009|sssss|sfasfsd|fasdfsd|lll|fasfsd';
i:=pos('|', temp);
while i<>0 do begin
a_StringList.add(copy(temp, 1, i - 1));
temp := copy(temp, i + 1, length(temp) - i);
i:=pos('|', temp);
end;
end;
 
function ExtractStrings(Separators, WhiteSpace: TSysCharSet; Content: PChar;
Strings: TStrings): Integer;
var
Head, Tail: PChar;
EOS, InQuote: Boolean;
QuoteChar: Char;
Item: string;
begin
Result := 0;
if (Content = nil) or (Content^=#0) or (Strings = nil) then Exit;
Tail := Content;
InQuote := False;
QuoteChar := #0;
Strings.BeginUpdate;
try
repeat
while Tail^ in WhiteSpace + [#13, #10] do Inc(Tail);
Head := Tail;
while True do
begin
while (InQuote and not (Tail^ in ['''', '"', #0])) or
not (Tail^ in Separators + [#0, #13, #10, '''', '"']) do Inc(Tail);
if Tail^ in ['''', '"'] then
begin
if (QuoteChar <> #0) and (QuoteChar = Tail^) then
QuoteChar := #0
else QuoteChar := Tail^;
InQuote := QuoteChar <> #0;
Inc(Tail);
end else Break;
end;
EOS := Tail^ = #0;
if (Head <> Tail) and (Head^ <> #0) then
begin
if Strings <> nil then
begin
SetString(Item, Head, Tail - Head);
Strings.Add(Item);
end;
Inc(Result);
end;
Inc(Tail);
until EOS;
finally
Strings.EndUpdate;
end;
end;
这就是DELPHI自带的,你看看
 
procedure ExtractStrings(const SourceStr, Separator: String; var Str: TStrings);
var
S: String;
P: PShortString;
SprLen, X: Integer;
begin
S:= SoruceStr + Separator + #0;
Str.Clear;
X:= Pos(Separator, S);
SprLen:= Length(Separator) - 1;
Str.Add(Copy(S, 1, X - 1);
while S[X+SprLen+1] <> #0 do begin
P:= @S[X+SprLen];
P^[0]:= #255;
X:= Pos(Separator, P^);
if X = 0 then Break;
P^[0]:= Chr(X - 1);
Str.Add(P^);
end;
end;
 
呵呵,我也来贴一个

var
tmp:TStringList;
begin
tmp:=TStringList.Create
tmp.Delimiter:='|';
tmp.DelimitedText:='0009|sssss|sfasfsd|fasdfsd|lll|fasfsd|'
//tmp.Strings[0]=='0009'
end;
end;
 
顶部