![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| ШурикС |
|
|||
|
Unregistered |
Подскажите, кто знает, пожалуйста, есть ли в Дельфи эквивалент VB(A)-вской ф-ии Split (делит строку в зависимости от символа-делителя, напр. "Всем привет" на основе [пробела] делит на "Всем" и "привет", ну и есс-но возвращает результаты в массив).
Заранее спасибо! |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Такой вроде нет, но можно легко это организовать самому (используя функции Pos и Copy), могу написать, если у самого не получится.
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| ШурикС |
|
|||
|
Unregistered |
Буду Вам очень признателен, а то я начал мухлевать с указателями и залез в непролазные глючные дебри, из которых не могу выбраться (я всего лишь новичок, так что пожалуйста не судите строго) уже вторые сутки. |
|||
|
||||
| remax |
|
|||
|
Доцент ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 686 Регистрация: 7.4.2002 Где: Украина, Харьков Репутация: 1 Всего: 5 |
В распостраненных библиотеках встречаются подобные штучки,
например функция SubStr из библиотеки RaLib -------------------- Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Вариант 1.
В Дельфи есть специальный класс для хранения массивов строк - TStringList - очень рекомендую. Вот как вашу строку превратить в TStringList:
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Вариант 2. Используем стандартные массивы:
После использования массива не забудте освободить память a:=nil или setlength(a,0) -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| remax |
|
|||
|
Доцент ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 686 Регистрация: 7.4.2002 Где: Украина, Харьков Репутация: 1 Всего: 5 |
Vit, первый вариант очень красив!
А вот второй имеет шероховатости. В частности, Ваш алгортим неправильно отработает, если в конце строки будет пробел - добавиться пустая строка, если подряд идут несколько пробелов и т.д. Предлагаю его немного скорректировать: var a:array of string;//наш массив s:string;//строка которую мы будем разбивать begin s:='Windows Messages SysUtils Variants Classes Graphics Controls Forms'; s:=Trim(s)+' '; // Насильственно делаем обрезание и добавляем пробел в конец While (length(s)>1) do begin //мы постепенно заполняем массив на каждом шаге цикла по 1 элементу setlength(a,length(a)+1);//увеличиваем размер массива на 1 a[length(a)-1]:=copy(s,1, pos(' ',s)-1);//присвоение последнему элементу массива первого слова строки (без финального пробела) s:=TrimLeft(copy(s,pos(' ',s)+1, length(s)));//удаляем из строки слово end; //теперь проверяем что получили showmessage(a[0]); showmessage(a[1]); showmessage(a[2]); -------------------- Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Легко корректируется таким образом: Первой строкой ставим: s:=trim(StringReplace(s,' ',' ',[rfReplaceAll])); Это удалит и все множественные пробелы и пробелы на концах. -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Кстати можно скрестить оба варианта - для разбивки использовать TStringList, а затем его перебросить в массивв...
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| remax |
|
|||
|
Доцент ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 686 Регистрация: 7.4.2002 Где: Украина, Харьков Репутация: 1 Всего: 5 |
Да, совершенно верно. Но, если учитывать не только функциональность кода, но и его "красивость" - в учебных целях, то мой мой вариант лучше. - Во первых, он короче (комментарии я специально оставлял в оригинале - для объективности оценки) - Во вторых, "прозрачнее" - нет лишних телодвижений. Понятно, что для скорости выполнения или уменьшения исполняемого кода для современных ПК это слезы, но для обучения хорошему стилю программирования это принципиально. -------------------- Как бы ты не старался быть хорошим и правильным человеком с принципами и уважительным отношением к другим, всегда найдется кто-то, кто бросит в тебя какашку |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Вообще, по-моему, где-то в RxLib лежит подходящая функция. Но она настолько проста, что сделать нечто подобное не представляет затруднений:
procedure SplitOnWords(const s:string; Delimiters:set of char; Strings:TStrings); var p,sp:PChar; str:string; begin include(Delimiters,#0); //чтоб уж наверняк p:=pointer(s); while true do begin //пропускаем все разделители в начале while p^ in Delimiters do if p^=#0 then exit else inc(p); sp:=p; //пока не кончилось слово. while not (p^ in Delimiters) do inc(p); //запоминаем слово SetLength(str,cardinal(p)-cardinal(sp)); Move(sp^,pointer(str)^,cardinal(p)-cardinal(sp)); Strings.Add(str); end; end; Там была так же определена константа - стандартные разделители. P. S. Строки Delphi хоть и являются паскалевскими, но совместимы с С-строкой. P.P.S. Сейчас вспомнил - небыло там такой функции (или просто я о ней не слышал) - была WordCount. -------------------- Волны гасят ветер... |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |