Удаление лишних пробелов

Задача

Удалить в строке все лишние пробелы.

Лишними считаются пробелы, следующие непосредственно за пробелами. Т.е. между словами всегда должен находиться один пробел.

Решение

Посимвольно перебирать строку, пока не будет достигнут конец строки. Если очередной символ является пробелом и после него также находится пробел, то скопировать строку до текущего символа и добавить к ней остаток строки, пропустив один символ.

Программа на языке Паскаль:

var
    s: string;
    i: byte;
begin
    write('String: ');
    readln(s);
    i := 1;
    repeat
        if copy(s,i,2)='  ' then
            s := copy(s,1,i) + copy(s,i+2,length(s))
        else
            i := i + 1
    until (i > length(s));
    writeln('String: ', s);
readln
end.

Тема

Строки

Уровень

Сложные задачи

Комментарии

program probeli;
uses crt;
var
s:string;
i,dl,k:integer;
begin
writeln ('Введите строку');
readln (s);
k:=0; i:=1; dl:=length(s);
while i<dl do
begin
if s[i]<>' ' then i:=i+1;{если не пробел переходим к следующему символу}
if s[i]=' ' then i:=i+1; {если пробел то осталяем первый пробели переходим к следующему симолу}
while s[i]=' ' do {удаляем симол до тех пор пока он пробел}
delete (s,i,1);
if ((s[i]='.')or(s[i]=',')or(s[i]='?')or(s[i]='!')or(s[i]='-')or(s[i]=':'))and(s[i-1]=' ') then begin delete (s,i-1,1); end; {если этот символ знак пунктуации то удаляем пробел перед ним}
dl:=length(s);{присваиваем измененную длинну строки переменной}
end;
writeln (s);
end.

Как эту программу приспособить для файла, а не для ввода с клавиатуры, т.е. читает свои входные данные из текстового файла и перезаписывает на правильный вариант.

Ответ на от Гость

Если в файле содержится не более 255 символов, то можно сделать так:

var
    s: string;
    i: byte;
    f: text;
begin
    assign(f,'c:/data.txt');
    reset(f); {открываем для чтения}
    readln(f,s); {читаем содержимое в строку}
 
{ изменяем строку }
    i:=1;
    repeat
        if copy(s,i,2) = '  ' then {в кавычках 2 пробела}
            s := copy(s,1,i) + copy(s,i+2,length(s))
        else
            i := i+1
    until (i > length(s));
 
    rewrite(f); {открываем файл для перезаписи}
    writeln(f,s); {записываем}
    close(f); {закрываем}
 
readln
end.

 

Ответ на от gene

Она работает если в тексте не больше 2 пробелов а если их больше 2 тогда вот:

var
s:string;
i,j,l:integer;
begin
writeln('Vvedite stroky:');
chet:=0;
readln(s);
for i:=1 to length(s) do begin
  j:=i;
  if s[i]=' ' then begin
    while s[j]=' ' do begin
      j:=j+1;
      if s[j]=' ' then
      delete(s,j,1);
    end;
  end;
end;
writeln(' Result: ',s);
end.