Удалить лишние пробелы из строки, использую процедуру.
Подскажите, что неправильно:
program prim;
type
arr=array [1..50] of string;
var
a: arr;
str: string;
i: integer;
procedure trim(str:string; a: arr);
var
i: integer;
begin
for i:=1 to length(str) do
if (a=' ') and (a[i+1]=' ')
then
delete(str, i+1, 1);
end;
begin
writeln('Введите строку');
readln(str);
for i:=1 to length(str) do
a:=copy(str, i,1);
trim(str, a);
writeln;
writeln(str);
readln;
end.
Другие языки программирования и технологии
Паскаль строки
Во первых зачем массивы? если вводить с клавиатуры одну строку и удалять пробелы
итак у вас
вводим строку
от 1 до длина_строки
копируем одну букву
и пытаемся присвоить ее массиву строк (вот тут и начинается неправильно)
строка и есть массив символов, используйте Pos для нахождения двойного пробела
в цикле while пока не останется в строке двойных пробелов удаляйте лишние процедурой Delete
итак у вас
вводим строку
от 1 до длина_строки
копируем одну букву
и пытаемся присвоить ее массиву строк (вот тут и начинается неправильно)
строка и есть массив символов, используйте Pos для нахождения двойного пробела
в цикле while пока не останется в строке двойных пробелов удаляйте лишние процедурой Delete
Не правильно вот это
for i:=1 to length(str) do
if (a[ i ]=' ') and (a[i+1]=' ') then delete(str, i+1, 1);
У вас цикл до ДЛИНЫ строки, а вы пытаетесь получить i+1 символ, т. е. попадаете ЗА границу строки. А во-вторых, у вас цикл в прямом направлении выполняется в то время, как некоторые реализации паскаля верхнюю границу определяют один раз ДО выполнения цикла. А строка-то укарачивается при удалении "лишних" символов.. .
Вот так не будет виснуть
for i:=length(str) downto 2 do if (str[ i ]=' ') and (str[i-1]=' ') then delete(str, i, 1);
Дальше. Лучше, если это будет реализовано функцией, но если требуется все-таки процедура, то параметры нужно передавать по ссылке, т. е. со словом var, а не по значению, как у вас.
Ну и наконец, а для чего вы какой-то цикл крутите в основной программе после ввода исходной строки? Для какого ...Ой! А для чего вам массив из 50 строк? Задача решается строчкой, которую я привел выше. Вводите данные в переменную str, выполняете цикл и выводите результат. Все!
for i:=1 to length(str) do
if (a[ i ]=' ') and (a[i+1]=' ') then delete(str, i+1, 1);
У вас цикл до ДЛИНЫ строки, а вы пытаетесь получить i+1 символ, т. е. попадаете ЗА границу строки. А во-вторых, у вас цикл в прямом направлении выполняется в то время, как некоторые реализации паскаля верхнюю границу определяют один раз ДО выполнения цикла. А строка-то укарачивается при удалении "лишних" символов.. .
Вот так не будет виснуть
for i:=length(str) downto 2 do if (str[ i ]=' ') and (str[i-1]=' ') then delete(str, i, 1);
Дальше. Лучше, если это будет реализовано функцией, но если требуется все-таки процедура, то параметры нужно передавать по ссылке, т. е. со словом var, а не по значению, как у вас.
Ну и наконец, а для чего вы какой-то цикл крутите в основной программе после ввода исходной строки? Для какого ...Ой! А для чего вам массив из 50 строк? Задача решается строчкой, которую я привел выше. Вводите данные в переменную str, выполняете цикл и выводите результат. Все!
Похожие вопросы
- паскаль... строки...функция delete. не подскажете, почему в этой программе она не выполняется,что опять не так тут?(((
- паскаль(строки)
- строки в паскале
- Как заменить слово в строке?Паскаль
- по строкам в Паскале
- строки в Паскале
- Как разделить слова в строке, чтобы их потом сравнивать друг с другом и сортировать? (Паскаль)
- Помогите решить задачу в паскале. Задание: Заменить в строке все вхождения "да" на "нет".
- Как найти слово в строке. Паскаль
- Турбо Паскаль 7.0 В функцию val можно загнать конкретный элимент строки или можно только всю строку?
var
str: string;
i: integer;
procedure trim(str:string);
var
i: integer;
begin
i:=pos(str,' ');
while i=0 do
delete(str, i, 1);
end;
begin
writeln('Введите строку');
readln(str);
trim(str);
writeln;
writeln(str);
readln;
end.
Просто виснет и ничего не делает, помогите, пожалуйста