Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.05.11;
Скачать: [xml.tar.bz2];

Вниз

Проблемы при переборе символов в строке   Найти похожие ветки 

 
Rhammer ©   (2008-04-11 15:27) [0]

Здраствуйте, передо мной цель обработать строку так чтобы заменялись на пробелы все точки до тех пор пока не встретится буква "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;


 
Reindeer Moss Eater ©   (2008-04-11 15:30) [1]

нет проверки на выход за пределы длины строки


 
Rhammer ©   (2008-04-11 15:32) [2]

Как это нет?
      while ((onesimb[j]<>"v") or (length(onesimb)<>j)) do
переменная j увеличивается согласно каждой букве в строке, и условие цикла проверяет если длина строки равна j то закончить цикл


 
Reindeer Moss Eater ©   (2008-04-11 15:37) [3]

Да вот так нет.


 
Rhammer ©   (2008-04-11 15:38) [4]

Ясно. Не подскажете как исправить? Наверное пересидел, элементарных вещей не замечаю


 
DVM ©   (2008-04-11 15:38) [5]


> Rhammer ©  

StringReplace используй


 
Rhammer ©   (2008-04-11 15:39) [6]

Спасибо, сейчас попробую


 
clickmaker ©   (2008-04-11 15:40) [7]

а зачем вычислять длину в цикле, если она уже вычислена перед?


 
Reindeer Moss Eater ©   (2008-04-11 15:41) [8]

Наверное пересидел, элементарных вещей не замечаю

Отладчик зато не пересиживает никогда.

Ну где например проверка на то, что j это валидный индекс?


 
Семеныч   (2008-04-11 15:48) [9]

> 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;


 
Rhammer ©   (2008-04-11 15:49) [10]


> DVM ©   (11.04.08 15:38) [5]
> > Rhammer ©  StringReplace используй

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


> clickmaker ©   (11.04.08 15:40) [7]
> а зачем вычислять длину в цикле, если она уже вычислена
> перед?

я пробовал подставлять переменную.


> Reindeer Moss Eater
Ну где например проверка на то, что j это валидный индекс?

Можно вопрос, а что это?


 
Rhammer ©   (2008-04-11 15:51) [11]


> Семеныч

Спасибо, только начал изучать после паскаля, даже незнал что exit; может прекащать цикл :)


 
clickmaker ©   (2008-04-11 15:52) [12]


> что j это валидный индекс?
>
> Можно вопрос, а что это?

если коробка для яиц имеет 10 ячеек, то попытка достать 11-е яйцо - невалидная


 
Семеныч   (2008-04-11 15:53) [13]

> Rhammer ©   (11.04.08 15:51) [11]

Exit прекращает всю процедуру. А цикл прекращает Break.


 
Reindeer Moss Eater ©   (2008-04-11 16:12) [14]

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;


 
DVM ©   (2008-04-11 16:13) [15]


> Rhammer ©   (11.04.08 15:49) [10]


> Хотя если разбить строку на две

Да, сначала разбей. Не самый быстрый по скорости, но самый короткий по написанию способ.


 
Danco ©   (2008-04-12 12:38) [16]

> 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)));



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.05.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.006 c
15-1206343589
Ega23
2008-03-24 10:26
2008.05.11
Возможно ли в Windows получение текущего времени


2-1207770561
Polar
2008-04-09 23:49
2008.05.11
MessageDlg на русский язык


2-1208157323
arinyshka
2008-04-14 11:15
2008.05.11
Определить источник события


2-1207662818
switch
2008-04-08 17:53
2008.05.11
Как изменить цвет QRShape


15-1206724373
tesseract
2008-03-28 20:12
2008.05.11
Быстрый tiling





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский