Поиск в строке

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Поиск в строке

Сообщение sign » 24.04.2010 10:03:32

Что-то я не понимаю!
0.9.28.2
XP
Вот код
Код: Выделить всё
   
   ...
    FIndex: Integer;     
    FLength: Integer;   
    FStr: String;     
...
// Найти с текущей позиции символ в строке
function TJ.FindChar(Ch: Char): Boolean;
var i: Integer;
begin
  repeat
    i := 0;
    while i < FLength do begin
      if FStr[i] = Ch then begin
        FIndex := i;
        Exit(True);
      end;
      Inc(i);
    end;
  until NextChar(False);
end;

Значение строки FStr = {"0134"}
Ищется двойная кавычка, Ch = "
Равенство FStr[i] = Ch выполняется при i=2!!!!!
После возврата из этой функции, я получаю указатель FIndex не на символе ", а на 0.

Я где заблуждаюсь или косячу?
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Поиск в строке

Сообщение MageSlayer » 24.04.2010 10:37:46

Код: Выделить всё
// Найти с текущей позиции символ в строке
function TJ.FindChar(Ch: Char): Boolean;
var i: Integer;
begin
   Result:=false;
    i := 1;
    while i <= FLength do begin
      if FStr[i] = Ch then begin
        FIndex := i;
        Exit(True);
      end;
      Inc(i);
    end;
end;
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Re: Поиск в строке

Сообщение sign » 24.04.2010 11:10:08

Это без разницы, с какого начинать, хотя мне непонятно, почему проходит с нуля.
Т.е. индекс после сравнения у меня всегда +1, почему?
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Поиск в строке

Сообщение MageSlayer » 24.04.2010 11:15:12

sign писал(а):Это без разницы, с какого начинать, хотя мне непонятно, почему проходит с нуля.

Строки индексируются с 1, а не нуля. И это не "без разницы".

sign писал(а):Т.е. индекс после сравнения у меня всегда +1, почему?

Код, что я сбросил, пробовали?
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Re: Поиск в строке

Сообщение sign » 24.04.2010 11:22:44

Функция Pos дает ответ - 2.
Если счет с единицы, то всё в порядке.
Но, когда делаем Ctrl-F7 - чтобы посмотреть значение, то FStr[2] - выдает следующее значение, т.е., как если бы счет шел с 0.

Код ваш пробовал. без изменений.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Поиск в строке

Сообщение VirtUX » 24.04.2010 12:10:28

Не стал разбираться с Вашим примером - уж слишком заверчено. Вот моя функция решающая, как мне кажется, Вашу проблему.
Код: Выделить всё
function FromPos(const Sub, Str: String; const FP: Word): SizeInt; //ищет подстроку Sub, начиная с FP позиции в строке Str

Код: Выделить всё
function FromPos(const Sub, Str: String; const FP: Word): SizeInt;
var
  STemp: String;
  WTemp, WPos, L: Word;
begin
  Result := 0;
  WTemp:= FP;
  if FP = 0 then WTemp := 1;
  L := length(Str);
  if FP > L then WTemp := L;
  STemp := Copy(Str, WTemp, L);
  WPos  := pos(Sub, STemp);
  if WPos > 0 then Result := WPos + pred(WTemp);
end; 
Последний раз редактировалось VirtUX 24.04.2010 12:21:31, всего редактировалось 1 раз.
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Поиск в строке

Сообщение MageSlayer » 24.04.2010 12:20:24

Код: Выделить всё
program Project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };

var
    FIndex: Integer;
    FLength: Integer;
    FStr: String;

function FindChar(Ch: Char): Boolean;
var i: Integer;
begin
   Result:=false;
    i := 1;
    while i <= FLength do begin
      if FStr[i] = Ch then begin
        FIndex := i;
        Exit(True);
      end;
      Inc(i);
    end;
end;

begin
  FStr:='"0134"';
  FLength:=Length(FStr);
  FIndex:=0;

  if FindChar('"') then
    WriteLn(FIndex);
end.


У меня выдает, как и положено, 1.
То есть результат полностью идентичен Pos.

Что касается отладчика, Ctrl+F7 и пр. - тут возможны баги, т.к. gdb заточен на C, а там как раз счет от индексов массива идет нуля.
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Re: Поиск в строке

Сообщение sign » 24.04.2010 12:45:21

Короче, понял.
Дело в отладчике, что в нем индекс считается с 0, а реально в программе с 1.

Добавлено спустя 24 секунды:
Спасибо!
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 239

Рейтинг@Mail.ru