Du speicherst nur am Anfang einmal einen Buschtaben in S, host dir davon den Pointer P und veränderst danach ständig das S.
Und nun rate mal, was passiert ... der Speicher von S ändert sich, er liegt nun also an einer anderen Stelle, aber du bleibst hartnäckig auf der alten Position stehen, schreibst somit in der Wildnis rum und verschrottest somit auch fremden Speicher, welche nicht mehr zum S gehört.
Du mußt also nach Änderung von S auch P aktualisieren, oder laß das unsicher Pointer-Gedöhns.
Delphi-Quellcode:
var
s: string;
i, i2: integer;
begin
s := 'a';
i2 := 1;
for i := 1 to 5000 do
begin
writeln(s);
if s[i] = 'z' then
begin
s := s + 'a';
inc(i2);
end
else
inc(s[i2]);
end;
writeln('ok');
readln;
end.
[edit]
@einbeliebigername: Beachte, daß Strings bei 1 und nicht bei 0 beginnen.
[edit2]
i2/j ist ja das letzte Zeichen, also kann man auch das Letzte verwenden, anstatt mitzuzählen.
Delphi-Quellcode:
var
s: string;
i: Integer;
begin
s := 'a';
for i := 1 to 5000 do
begin
WriteLn(s);
if s[Length(s)] = 'z' then
s := s + 'a'
else
Inc(s[Length(s)]);
end;
WriteLn('ok');
ReadLn;
end.