pos函数和LastDelimiter函数的BUG(100)

  • 主题发起人 主题发起人 liuchong
  • 开始时间 开始时间
L

liuchong

Unregistered / Unconfirmed
GUEST, unregistred user!
var AllFile:TStringList;function GetCount(S:string):string;var I:Integer;begin Result:=''
I:=LastDelimiter('本',S)-1;//这里取'本'字结果是6,用Pos结果也是6,BUG???? //I:=LastDelimiter(')',S)-3;//这里取')'正常 while I>0 do begin if (S in ['0'..'9']) then Result:=Format('%s%s',[S,Result]) else Break
Dec(I)
end;end;procedure TForm1.FormCreate(Sender: TObject);begin AllFile:=TStringList.Create
AllFile.Add('名扬票据10.8/27号7门(无碳复写32开,白、粉、绿三联100本)')
AllFile.Add('名扬票据10.8/27号7门(无碳复写32开,白、粉两联200本)')
AllFile.Add('名扬票据10.8/8-9区坡道(40开40克100本)')
AllFile.Add('名扬票据10.8/奋龙充电灯(无碳复写32开,白、粉两联100本)')
AllFile.Add('名扬票据10.8/福成金标准件(无碳复写32开,白、粉两联100本)');end;procedure TForm1.FormClose(Sender: TObject
var Action: TCloseAction);begin FreeAndNil(AllFile);end;procedure TForm1.btn1Click(Sender: TObject);var I:Integer;begin for I:=0 to AllFile.Count-1 do ShowMessage(GetCount(AllFile.Strings));end;
 
从 SysUtils.Pas 复制出 LastDelimiter 函数,并修改如下:function LastDelimiter(const Delimiters, S: string): Integer;var P: PChar;begin Result := Length(S)
P := PChar(Delimiters)
while Result > 0 do begin if (S[Result] <> #0) and (StrScan(P, S[Result]) <> nil) then{$IFDEF MSWINDOWS} if (ByteType(S, Result) = mbTrailByte) then begin //增加 Dec(Result)
Exit
//增加 end else //增加 end Exit;{$ENDIF}{$IFDEF LINUX} begin if (ByteType(S, Result) <> mbTrailByte) then Exit
Dec(Result)
while ByteType(S, Result) = mbTrailByte do Dec(Result)
end;{$ENDIF} Dec(Result)
end;end;
 
这不是函数的bug,仅仅是因为这些函数不支持汉字,你可以看看你说的那个6的位置,把前后两个汉字拆开再让相邻的两部分合并,估计就是 本 的码值。Delphi7的String类型就是标准的ASCII,汉字需要你自己去处理
 
字符串是汉字的时候,就要注意以下,其占两个字节~~
 
楼主太可笑了。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
911
SUNSTONE的Delphi笔记
S
S
回复
0
查看
906
SUNSTONE的Delphi笔记
S
S
回复
0
查看
884
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部