hungnguyen
hungnguyen

Reputation: 64

Pascal Infinite while loop

I'm implementing a program in FreePascal in Win10(64-bit). The problem state:

'Given a string, replace all substring 'child' with 'childhood' '

or

'Replace all 'child' with 'childhood''

I try this program

uses crt;
var s, newS : string;
    tmp, tmp2, tmp3 : int64;
    tmpstr, tmpstr2 : string;
    step, step2, step3 : longint;
    position : longint;

begin
        clrscr;
        write('Nhap xau : '); readln(s);
        //main mechanism

        while pos('child',s) <> 0 do begin
                position := pos('child', s);
                delete(s, pos('child',1), 5);
                insert('childhood',s,position);
                inc(position, 9);
                newS := '';
                for step:=position to length(s) do begin
                        newS := newS + s[step];
                end;
                s := newS;
        end;
        writeln(s);

        readkey;
end.

You can see that this part:

inc(position, 9);
newS := '';
for step:=position to length(s) do begin
        newS := newS + s[step];
end;
s := newS;

was used to try to cut off the while loop, but it doesn't work. Any idea?

Thanks a lot and have a good day! Thanks for reading this question thread! =)

Upvotes: 0

Views: 434

Answers (1)

This is just one of the possibilities, not optimized but perhaps the easiest to understand:

oldstr := 'original child string';
newstr := '';

while oldstr<>'' do begin
  // analyze the string from left to right
  if copy(oldstr, 1 5)='child' then begin
    // match found, perform substitution
    newstr := newstr+'childhood';
    delete(oldstr, 1, 5)
  end else begin
    // does not match, go ahead to the next possibility
    newstr := newstr+oldstr[1];
    delete(oldstr, 1, 1)
  end
end
// now newstr is the desired result

The gotcha here was to not analyze again what was added in a previous step (child->childhood). The algorithm above (warning, I've not tested it) ensures that any single char from the original string is checked only once.

Upvotes: 1

Related Questions