比较字符串是否相同的问题,高手请进!急急急! ( 积分: 5 )

  • 主题发起人 主题发起人 zpselect
  • 开始时间 开始时间
Z

zpselect

Unregistered / Unconfirmed
GUEST, unregistred user!
两个字符串:S1,S2,两字符串有以下可能值
S1:='ABCD',S2:=' ABCD'
S1:='ABCD',S2:='ABCD '
S1:=' ABCD',S2:=' ABCD'
S1:='ABCD ',S2:='ABCD'
S1:='ABCD',S2:=' ABCD '
注意空白的地方为空格
即不管S1,或者S2的前后有空格都相等!
不能用Trim函数!

再说明一下 S1:=' ABCD ',A前面有三个空格,D后面有2个空格
S2:='ABCD ',A前面没有空格,D后面有6个空格
不管其空格多少,其值是相等的 即S1=S2
 
晕,才5分
StringReplace(S,‘ ’, ‘’,[replaceall]);
 
不能用Delphi的系统函数去做,也就是说不管S1,或者S2两头有空格都是相等的,字符串中间没有空格出现的可能!
 
procedure TForm1.Button1Click(Sender: TObject);
var i: integer; S1, S2: string;
begin
S2 := '';
S1 := edit1.Text;
for i := 0 to Length(S1)-1 do
begin
if S1 <> '' then
S2 := S2 + S1;
end;
edit2.Text := s2;
end;
我这么写怎么不行啊!
 
function CompareStr(S1, S2: string): boolean;
var
i:integer;
SS1, SS2: string;
begin
Result := True;
for i:=1 to Length(S1) do if S1[1]<>' 'then SS1:= SS1 + S1;
for i:=1 to Length(S2) do if S2[1]<>' 'then SS2:= SS2 + S2;
for i:=1 to Length(SS1) do
begin
if SS1<> SS2 then
begin
Result := false;
Exit;
end;
end;
end;
 
unction CompareStr(S1, S2: string): boolean;
var
i: integer;
begin
for i := Length(S1) downto 0 do
if s1 = ' ' then
Delete(s1, i, 1);

for i := Length(S2) downto 0 do
if s2 = ' ' then
Delete(s2, i, 1);
Result := s1 = s2;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if CompareStr(edit1.Text, edit2.Text) then
showmessage('true') else showmessage('false');
end;
 
忘记说一件事了,S1,S2的太大了,可能为几百兆,所以我这种方法也不行!太耗内存了!可否有不用占用内存的方法就可以判断两个字符串是否相同?
 
所以说我的这个方法也不行!
 
再说明一下 S1:=' ABCD ',A前面有三个空格,D后面有2个空格
S2:='ABCD ',A前面没有空格,D后面有6个空格
不管其空格多少,其值是相等的 即S1=S2
 
>>S1,S2的太大了,可能为几百兆

光两个字符串都快1G了?你的机子有那么大内存吗?

你这比较,直接跳过左右两边的空格,再行比较就行了,好像很简单。

function MyCompare(const S1, S2: string): Boolean;
var
P1, P2, E1, E2: PChar;
L1, L2: Integer;
begin
P1 := PChar(S1);
P2 := PChar(S2);
L1 := Length(S1);
L2 := Length(S2);
E1 := P1 + L1 - 1; // S1的结尾
E2 := P2 + L2 - 1; // S2的结尾

while P1^ = #32 do Inc(P1); // 跳过左边空格
while P2^ = #32 do Inc(P2); // 跳过左边空格
while E1^ = #32 do Dec(E1); // 跳过左边空格
while E2^ = #32 do Dec(E2); // 跳过左边空格

Result :=
( (E1 - P1) = (E2 - P2) ) and // 检查长度是否相同
CompareMem(P1, P2, E1 - P1); // 再比较内容
end;

随手写的,自己检查。
 
是的,会很大!!
P1 := PChar(S1);
P2 := PChar(S2);
L1 := Length(S1);
L2 := Length(S2);
这样写会不会占内存啊?
 
高手们给我改一下函数:
function CompareStr(S1, S2: string): boolean;
var
i, j: integer;
begin
result := true;
for i := 1 to length(s1) do
begin
if ord(s1) > 32 then
break;
end;

for j := 1 to length(s2) do
begin
if ord(s2[j]) > 32 then
break;
end;

while (result) and (i <= length(s1)) and (j <= length(s2)) do
begin
if s1 <> s2[j] then
result := false
else
begin
inc(i);
inc(j);
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
S1, S2: string;
begin
S1 := ' ABC';
S2 := ' ABC ';
if CompareStr(s1, s2) then showmessage('=')
else showmessage('<>');
end;
上面这种方法是可以判断的相等的,当将S1或都S2的前后加一个字符结果也是相等!!!
如: S1 := ' ABC';
S2 := ' ABCa ';
用 CompareStr(s1, s2)判断结果也是相等的,这是错误的,请高手们帮我改一下上面的函数!谢谢!
 
Function IsSame(S1,S2 : String):Boolean;
const
SizeOfInt = SizeOf(Integer);
var
P1,P2,PBlank : PChar;
L1,L2,ShortL, LongL : Integer;
D1,D2 : ^DWORD;
I:Integer;
begin
Result := False;
L1 := Length(S1);
L2 := Length(S2);
P1 := PChar(S1);
P2 := PChar(S2);
if P1 = P2 then //如果数据地址一样,就不用判断了.
begin
Result := True;
Exit;
end;
While P1^ = ' ' do Inc(P1);
While P2^ = ' ' do Inc(P2);
Dec(L1, P1 - PChar(S1));
Dec(L2, P2 - PChar(S2));
ShortL := L1;
if L2 < ShortL then
ShortL := L2;
//此时ShortL是较小的长度
D1 := Pointer(P1);
D2 := Pointer(P2);
for I := 0 to (ShortL div SizeOfInt)-1 do //4字节比较,速度比单个字节快,字符串较长的的时候优势就体现出来了
begin
if D1^ <> D2^ then
Exit;
Inc(D1);
Inc(D2);
end;
P1 := PChar(D1);
P2 := PChar(D2);
for I := 0 to (ShortL mod SizeOfInt)-1 do //比较剩下的长度余数
begin
if P1^ <> P2^ then
Exit;
Inc(P1);
Inc(P2);
end;
if L1 < L2 then
begin
PBlank := P2;
LongL := L2 - L1;
end
else
begin
PBlank := P1;
LongL := L1 - L2;
end;
//看看较长的字符串剩下的是不是都是空格
for I :=0 to LongL -1 do
begin
if PBlank <> #$20 then
Exit;
end;
Result := True;
end;
 
function StrEquals(const S1, S2: string): Boolean;
var
Lo1, Lo2, Len1, Len2: Integer;
begin
Result := False;
Lo1 := 1;
Lo2 := 1;
Len1 := Length(S1);
Len2 := Length(S2);
while (Lo1 <= Len1) and (S1[Lo1] <= ' ') do
Lo1 := Lo1 + 1;
while (Lo2 <= Len2) and (S2[Lo2] <= ' ') do
Lo2 := Lo2 + 1;

while (Lo1 <= Len1) and (Lo2 <= Len2) do
begin
if (UpCase(S1[Lo1]) <> UpCase(S2[Lo2])) then
Exit;
Lo1 := Lo1 + 1;
Lo2 := Lo2 + 1;
end;

while (Lo1 <= Len1) do
begin
if S1[Lo1] > ' ' then
Exit
else
Lo1 := Lo1 + 1;
end;

while (Lo2 <= Len2) do
begin
if S2[Lo2] > ' ' then
Exit
else
Lo2 := Lo2 + 1;
end;
Result := True;
end;
别人写的,分享给大家吧!
 
后退
顶部