Заменить пробел и группы пробелов символом "*"

Задача

Дана строка слов, разделенных пробелами. Между словами может быть несколько пробелов, в начале и конце строки также могут быть пробелы. Требуется преобразовать строку так, чтобы в ее начале и конце пробелов не было, а слова были разделены одиночным символом "*" (звездочка).

Решение

 

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

Чтобы избавиться от пробелов в конце строки, надо удалять по одному последнему символу, пока последним не окажется непробельный символ. Поскольку при удалении символа длина строки уменьшается, то при использовании счетчика его надо уменьшать на 1. Хотя можно обойтись без него, если на каждой итерации цикла измерять длину строки.

Алгоритм замены пробелов на звездочки с учетом, что подряд идущих пробелов может быть несколько, а "*" должна быть одна:

  1. Если очередной символ пробел, то смотрим не стоит ли уже перед ним звезда. Если это так, то просто удаляем пробел и уменьшаем на 1 счетчик символов, т.к. следующий исследуемый символ будет иметь тот же индекс, что и удаленный сейчас.
  2. Если очередной символ пробел, но перед ним нет звездочки, то удаляем пробел и на его место вставляем "*".
  3. Переходим к следующему символу.

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

 

var
    s: string;
    i: byte;
begin
    readln(s);
 
    i := 1; // избавляемся от пробелов спереди
    while s[i] = ' ' do delete(s,i,1);
    i := length(s); // избавляемся от пробелов сзади
    while s[i] = ' ' do begin delete(s,i,1); i := i - 1 end;
 
    i := 1; // замена пробелов звездочками
    while i <= length(s) do begin
		if s[i] = ' ' then
			if s[i-1] = '*' then begin
				delete(s,i,1);
				i := i - 1;
			end
			else begin
				delete(s,i,1);
				insert('*',s,i);
			end;
		i := i + 1;
    end;
 
    writeln(s);
end.

 

Пример работы программы:

     one   tho three four        five   six seven    
one*tho*three*four*five*six*seven

 

Тема

Строки

Уровень

Комбинированные задачи

Комментарии

program stroki;
           uses crt;
           var i:integer;
               s: string;
     begin
      clrscr;
      writeln('Введите строку: ');
      readln(s);    // считываем строку
      for i:=1 to length(s) do
          delete(s,pos('  ',s),1); //удаляем лишние пробелы внутри
      if s[1]=' ' then delete(s,1,1);     //удаляем пробел спереди
      if s[length(s)]= ' ' then delete(s,length(s),1);   //удаляем пробел в конце      
for i:=0 to length(s)-1 do
      if s[i]=' ' then s[i]:='*';   //меняем пробелы на *
      writeln;
      writeln(s);  //выводим результат
      readln;
     end.