手动字符串替换(自由Pascal)
我试图在不使用StringReplace的情况下替换字符串中的一个单词,知道如何替换吗 我使用4个文本框 第一个框是原文 第二个框是搜索词 第三个框是替换词 第四个框是结果文本手动字符串替换(自由Pascal),pascal,Pascal,我试图在不使用StringReplace的情况下替换字符串中的一个单词,知道如何替换吗 我使用4个文本框 第一个框是原文 第二个框是搜索词 第三个框是替换词 第四个框是结果文本 var Form1: TForm1; result: string; rep: string; i, iCount: integer; procedure TForm1.Button1Click(Sender: TObject); begin Edit4.Text := StringRepla
var
Form1: TForm1;
result: string;
rep: string;
i, iCount: integer;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit4.Text := StringReplace(Edit1.Text, Edit2.Text, Edit3.Text, [rfReplaceAll, rfIgnoreCase]);
begin
result := Edit4.Text;
rep := Edit3.Text;
iCount := 0;
for i := 1 to length(result) do
begin
if result[i] = rep then
inc(iCount);
end;
end;
label5.Caption := ('There was ' + IntToStr(iCount) + ' changes made');
end;
这应该像您希望的那样:
program mystringreplacetest;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils;
function MyStringReplace(const Input, Find, Replace : String; out Count : Integer) : String;
var
P : Integer;
begin
Count := 0;
Result := Input;
repeat
P := Pos(Find, Result);
if P > 0 then begin
Delete(Result, P, Length(Find));
Insert(Replace, Result, P);
Inc(Count);
end;
until P = 0;
end;
var
S : String;
Count : Integer;
begin
S := 'a cat another cat end';
S := MyStringReplace(S, 'cat', 'hamster', Count);
writeln(S, ' : ', Count);
readln;
end.
如果这是家庭作业,我给你留了几件事要做:
- 不区分大小写
- 避免重复扫描字符直到第一次出现
Find
Pos
功能和Delete
和Insert
程序,以备将来参考,那就太好了
PS:请注意,此代码包含一个陷阱,用于不小心的人。考虑当<代码>替换< /COD>字符串包含“代码>查找< /代码>一个时发生的情况(例如,查找=‘CAT’和‘替换’=CATFLAP’)。你能看到问题是什么,以及如何避免它吗?请向我们展示你迄今为止所做的尝试。更新**它似乎不想使用字符串替换函数计算你说:…不使用StringReplace,但你的代码使用的是
StringReplace()
?真正的问题是什么?您想避免使用StringReplace()
,还是想获得替换计数,或者两者都要?我无法让它与StringReplace一起使用,因此正在考虑另一种方法。是的,我确实想让它计算替换数,但无法让它工作。好的,我会准备一个答案,但记住以后不要问如何解决x,因为y是你的实际问题。你更快:)。我试图在没有代码的情况下制定一个答案,以防这是家庭作业,但如果只编写代码,速度会快得多。干杯这回答了你的问题吗?