|
Делфи. Ищу функцию типа Pos(s1,s2), но со стартом поиска не с 1 символа |
|
|
|
Jan 23 2012, 16:40
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(AHTOXA @ Jan 23 2012, 21:29)  StrPos: Что-то типа такого: ... А такая конструкция утечку памяти не создаст? Код Token := PChar(BigString); это вроде создаёт почти копию строки в динамической памяти, а следующая команда затрёт (?) оригинальный адрес. Кроме того, мне нужно работать в позициях оригинальной строки. То есть нужно эти адреса как-то преобразовывать в позиции.
Сообщение отредактировал GetSmart - Jan 23 2012, 16:40
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 23 2012, 16:41
|

Профессионал
    
Группа: Свой
Сообщений: 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 без справочной системы? все же на раз находится там!
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Jan 23 2012, 16:44
|
.
     
Группа: Участник
Сообщений: 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
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 23 2012, 16:52
|

фанат дивана
     
Группа: Свой
Сообщений: 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; // Вычислим индекс в строке
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jan 23 2012, 16:58
|
.
     
Группа: Участник
Сообщений: 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
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 23 2012, 16:59
|

Профессионал
    
Группа: Свой
Сообщений: 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;
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Jan 23 2012, 17:10
|

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

|
Цитата(GetSmart @ Jan 23 2012, 22:58)  Не может быть. Явно создаётся копия с #0 в конце строки. Даже указатель индивидуальный, явно будет отличаться от оригинальной строки. Да нет же  Это просто указатель на char. Мы его наводим на первый символ строки. И начинаем по ней елозить. Всё. Цитата Ок. А удалять Token я сам потом должен? Нет. Это просто указатель в середину строки. (Начинаю чувствовать себя попугаем  ) Цитата Самое главно, что хотелось бы иметь допустимость #0 байт внутри строк и при этом нормальной работы. Так что Сишные строки - это самый крайний ущербный вариант. PosEx запустить было бы идеально. Насчёт нуля - не уверен, надо проверять. PosEx могу запостить, но только завтра
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|