![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемы при переборе символов в строке [D7, WinXP]
Rhammer © (2008-04-11 15:27:00)Здраствуйте, передо мной цель обработать строку так чтобы заменялись на пробелы все точки до тех пор пока не встретится буква 'v' Например:
delphi.win32.exe.v.2.3.4 должно получиться после обработки delphi win32 exe v.2.3.4
Вот набросал код, но при исполнении программы вылетает ошибка "Access violation at address 00458438 in module "project1.exe"." Дебаггер указывает на строку где начинается цикл while
//Точки
if CheckBox3.Checked=True then
begin
j:=1;
for i:= 1 to StrToInt(label2.Caption) do
begin
onesimb:=namefolders[i];
lengthonesimb := length(onesimb);
while ((onesimb[j]<>'v') or (length(onesimb)<>j)) do
begin
if onesimb[j]='.' then onesimb[j]:=' ';
j:=j+1;
end;
j:=1;
namefolders[i]:=onesimb;
end;
end;
Danco (2008-04-12 12:38:00) [1]> Rhammer
> Здраствуйте, передо мной цель обработать строку так чтобы
> заменялись на пробелы все точки до тех пор пока не встретится
> буква 'v' Например:
> delphi.win32.exe.v.2.3.4 должно получиться после обработки
> delphi win32 exe v.2.3.4
Если у тебя одна буква 'v', то можешь воспользоваться простым копированием строки Copy, Pos...
var
S:String;
begin
S:='delphi.win.exe.v.2.3.4';
ShowMessage(Copy(S,Pos('v',S),Length(S)));
DVM (2008-04-11 16:13:00) [2]
> Rhammer © (11.04.08 15:49) [10]
> Хотя если разбить строку на две
Да, сначала разбей. Не самый быстрый по скорости, но самый короткий по написанию способ.
Reindeer Moss Eater (2008-04-11 16:12:00) [3]var ATail : string;
begin
with TRegExpr.Create do
try
Expression := '(.*)(v.*)';
if Exec('delphi.win32.exe.v.2.3.4') then
begin
ATail := Match[2];
Expression := '\.';
ShowMessage(Replace(Match[1],' ') + ATail);
end
finally
Free;
end;
end;
Семеныч (2008-04-11 15:53:00) [4]> Rhammer © (11.04.08 15:51) [11]
Exit прекращает всю процедуру. А цикл прекращает Break.
clickmaker (2008-04-11 15:52:00) [5]
> что j это валидный индекс?
>
> Можно вопрос, а что это?
если коробка для яиц имеет 10 ячеек, то попытка достать 11-е яйцо - невалидная
Rhammer (2008-04-11 15:51:00) [6]
> Семеныч
Спасибо, только начал изучать после паскаля, даже незнал что exit; может прекащать цикл :)
Rhammer (2008-04-11 15:49:00) [7]
> DVM © (11.04.08 15:38) [5]
> > Rhammer © StringReplace используй
Мне необходимо убирать точки до определнного символа, я почитал о этой функции там помоему этого нельзя сделать.
Хотя если разбить строку на две, сейчас попробую
> clickmaker © (11.04.08 15:40) [7]
> а зачем вычислять длину в цикле, если она уже вычислена
> перед?
я пробовал подставлять переменную.
> Reindeer Moss Eater
Ну где например проверка на то, что j это валидный индекс?
Можно вопрос, а что это?
Семеныч (2008-04-11 15:48:00) [8]> Rhammer © (11.04.08 15:27)
procedure ReplacePoints(var S: string);
var
i: integer;
begin
for i := 1 to Length(S) do
begin
if S[i] in ['v', 'V'] then
Exit;
if S[i] = '.' then
S[i] := ' ';
end
end;
Reindeer Moss Eater (2008-04-11 15:41:00) [9]Наверное пересидел, элементарных вещей не замечаю
Отладчик зато не пересиживает никогда.
Ну где например проверка на то, что j это валидный индекс?
clickmaker (2008-04-11 15:40:00) [10]а зачем вычислять длину в цикле, если она уже вычислена перед?
Rhammer (2008-04-11 15:39:00) [11]Спасибо, сейчас попробую
Rhammer (2008-04-11 15:38:00) [12]Ясно. Не подскажете как исправить? Наверное пересидел, элементарных вещей не замечаю
DVM (2008-04-11 15:38:00) [13]
> Rhammer ©
StringReplace используй
Reindeer Moss Eater (2008-04-11 15:37:00) [14]Да вот так нет.
Rhammer (2008-04-11 15:32:00) [15]Как это нет?
while ((onesimb[j]<>'v') or (length(onesimb)<>j)) do
переменная j увеличивается согласно каждой букве в строке, и условие цикла проверяет если длина строки равна j то закончить цикл
Reindeer Moss Eater (2008-04-11 15:30:00) [16]нет проверки на выход за пределы длины строки