реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Делфи. Ищу функцию типа Pos(s1,s2), но со стартом поиска не с 1 символа
GetSmart
сообщение Jan 23 2012, 15:50
Сообщение #1


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Существует ли такая?
Или как это можно делать малой кровью без искажения оригинала и создания новой субстроки поиска (через Copy например) ?


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 23 2012, 16:11
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(GetSmart @ Jan 23 2012, 17:50) *
Существует ли такая?
Или как это можно делать малой кровью без искажения оригинала и создания новой субстроки поиска (через Copy например) ?

Да вроде нет такой.
Так что остаётся передавать как параметр в свою функции и дальше с помощью Delete работать.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 23 2012, 16:16
Сообщение #3


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Ну ведь это на 99% такой же код, что и Pos(), только один дополнительный параметр. Почему никто не догадался сделать sad.gif
Профессионалы, блин.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 23 2012, 16:29
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



StrPos:
Что-то типа такого:
Код
function CountTokens(BigString, SubStr : string) : integer;
Var
  Token : PChar;
begin
  result := 0;
  Token := PChar(BigString);
  Token := StrPos(Token, PChar(SubStr));
  while (Token <> nil) do
  begin
    inc(result);
    Inc(Token);
  end;
end;


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 23 2012, 16:40
Сообщение #5


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(AHTOXA @ Jan 23 2012, 21:29) *
StrPos:
Что-то типа такого:
...


А такая конструкция утечку памяти не создаст?
Код
Token := PChar(BigString);

это вроде создаёт почти копию строки в динамической памяти, а следующая команда затрёт (?) оригинальный адрес.

Кроме того, мне нужно работать в позициях оригинальной строки. То есть нужно эти адреса как-то преобразовывать в позиции.

Сообщение отредактировал GetSmart - Jan 23 2012, 16:40


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
ARV
сообщение Jan 23 2012, 16:41
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(GetSmart @ Jan 23 2012, 19:50) *
Существует ли такая?

не катите бочку на профессионалов! такая функция есть!

Цитата
Delphi syntax:

function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;

Description

PosEx returns the index of SubStr in S, beginning the search at Offset. If Offset is 1 (default), PosEx is equivalent to Pos.

PosEx returns 0 if SubStr is not found, if Offset is greater than the length of S, or if Offset is less than 1.

у вас что, Delphi без справочной системы? все же на раз находится там!


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 23 2012, 16:44
Сообщение #7


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(ARV @ Jan 23 2012, 21:41) *
не катите бочку на профессионалов! такая функция есть!

Код
[Error] ????.pas(597): Undeclared identifier: 'PosEx'

Что подключить надо?

Цитата(ARV @ Jan 23 2012, 21:41) *
у вас что, Delphi без справочной системы? все же на раз находится там!

Есть Хелп. Этой функции там нет.

Сообщение отредактировал GetSmart - Jan 23 2012, 16:44


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
ARV
сообщение Jan 23 2012, 16:46
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



а что за версия Delphi у вас такая?!
подключать надо StrUtils.


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 23 2012, 16:52
Сообщение #9


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(GetSmart @ Jan 23 2012, 22:40) *
А такая конструкция утечку памяти не создаст?
Код
Token := PChar(BigString);

это вроде создаёт почти копию строки в динамической памяти, а следующая команда затрёт (?) оригинальный адрес.

Нет, это просто преобразование типов, никаких копий.
Цитата(GetSmart @ Jan 23 2012, 22:40) *
Кроме того, мне нужно работать в позициях оригинальной строки. То есть нужно эти адреса как-то преобразовывать в позиции.

Элементарно:
Код
  Token := PChar(BigString);
  Start = Token;   // Запомним начало
  Token := StrPos(Token, PChar(SubStr));
  IndexInString := Token - Start + 1;  // Вычислим индекс в строке


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 23 2012, 16:58
Сообщение #10


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(ARV @ Jan 23 2012, 21:46) *
а что за версия Delphi у вас такая?!
подключать надо StrUtils.

Делфи 5.
StrUtils не найден. Для начала попробую поискать.

Цитата(AHTOXA @ Jan 23 2012, 21:52) *
Нет, это просто преобразование типов, никаких копий.

Не может быть. Явно создаётся копия с #0 в конце строки. Даже указатель индивидуальный, явно будет отличаться от оригинальной строки.

Цитата(AHTOXA @ Jan 23 2012, 21:52) *
Элементарно:

Ок. А удалять Token я сам потом должен?
Потому как, когда один раз, то не ... жалко, а когда миллион раз, то надо об этом 7 раз подумать.

ЗЫ.
Самое главно, что хотелось бы иметь допустимость #0 байт внутри строк и при этом нормальной работы. Так что Сишные строки - это самый крайний ущербный вариант. PosEx запустить было бы идеально.

Сообщение отредактировал GetSmart - Jan 23 2012, 17:01


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
ARV
сообщение Jan 23 2012, 16:59
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



вы бы еще 3-ю версию юзали! самая ходовая 7-я версия - в ней есть очень много всего хорошего, и очень мало лишнего, что потом прилипло... рекомендую обновиться. еще рекомендую найти и скачать библиотеку JVCL - отличная бесплатная коллекция на все случаи жизни с открытыми исходниками.

если строки у вас "короткие", т.е. не WideString, то можно колупаться с посимвольным разбором так:
Код
var strptr : pchar;
    i : integer;
begin
   strptr = @my_str[1];
   // и далее strptr[0] - 1-й символ, как в Си. strptr можно менять, как угодно - все как в Си, только внутри my_str не будет 0 на конце.
   // strptr в функциях полностью "совместим" с типом string, т.е. можно так:
   i := Pos('тра-та-та', strptr);
   inc(strptr, i+1);
   // и так далее
end;


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 23 2012, 17:02
Сообщение #12


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(GetSmart @ Jan 23 2012, 20:58) *
Делфи 5.
StrUtils не найден. Для начала попробую поискать.

Возьмите в комплекте FreePascal.org Какая Ы разница..
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 23 2012, 17:02
Сообщение #13


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(ARV @ Jan 23 2012, 21:59) *
вы бы еще 3-ю версию юзали! самая ходовая 7-я версия

Щас попробую найти и пришпиндорить к 5-ой StrUtils.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 23 2012, 17:10
Сообщение #14


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(GetSmart @ Jan 23 2012, 22:58) *
Не может быть. Явно создаётся копия с #0 в конце строки. Даже указатель индивидуальный, явно будет отличаться от оригинальной строки.

Да нет жеsm.gif Это просто указатель на char. Мы его наводим на первый символ строки. И начинаем по ней елозить. Всё.
Цитата
Ок. А удалять Token я сам потом должен?

Нет. Это просто указатель в середину строки. (Начинаю чувствовать себя попугаемsm.gif )
Цитата
Самое главно, что хотелось бы иметь допустимость #0 байт внутри строк и при этом нормальной работы. Так что Сишные строки - это самый крайний ущербный вариант. PosEx запустить было бы идеально.

Насчёт нуля - не уверен, надо проверять. PosEx могу запостить, но только завтра sm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ARV
сообщение Jan 23 2012, 17:13
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



не советую. в 7-й версии заметно откорректирована библиотека VCL, через которую и происходили основные утечки. ПОЧТИ все дырки были устранены. так что приклеивать к 5-й версии что-то другое, тем более от FreePascal не советую. что советую - уже говорил.


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th June 2025 - 23:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.03091 секунд с 7
ELECTRONIX ©2004-2016