Цитата(CppDevelopeR @ 15.4.2008, 21:02 ) | Прав ли я, что тут удаляюца пробелы тока в 1 строке в файле? |
Файлов я тут не вижу
Вся проблема в том, что в данном коде:
Код | procedure delspace(var s:string); var i:integer; begin for i:=1 to length(s) do if s[i]=' ' then delete(s,i,1); end;
|
после удаления символа длина строки уменьшается и соответственно в следующий раз будет проверяться не тот символ который должен бы проверяться, а следующий. То есть при парных пробелах будет удалятся только один из них.
Вот пример:
Код | program Project1;
procedure delspace(var s:string); var i:integer; begin for i:=1 to length(s) do if s[i]=' ' then delete(s,i,1); end;
var s : string = 'a n v a'; begin delspace(s); writeln(s); readln; end.
|
идет наш цикл:
i длина строки проверяемый символ удаляем? 1 8 a нет 2 8 пробел да 3 7 пробел(см. объяснение 1) да 4 6 пробел(см. объяснение 2) да 5 5 a нет
Объяснение 1. Так как мы удалили пробел стоящий перед символом n, на позицию s[2] встал символ n, а позицию s[3] занял идущий за ним пробел.
Объяснение 2. То же самое, только другой символ.
На 5 итерации пробел уже пропускается, так как смещается на уже пройденную циклом позицию. Далее, так как значение от и до цикла for рассчитываются только один раз при запуске цикла, наш цикл прогоняет уже не существующие элементы строки. Тут как раз спасает цикл for x downto y do...
Я бы лично оформил данный код вообще без delete.
Код | program Project1;
function Delspace(s : string) : string; var i : integer; begin for i := 1 to length(s) do if s[i] <> ' ' then result := result + s[i]; end;
var s : string = 'a n v a'; begin s := delspace(s); writeln(s); readln; end.
|
|