Удаление лишних пробелов | |
---|---|
Jlutko Автор Сообщений: 161 Откуда: Пермская область Дата регистрации: 27.09.2005 |
Всем доброго времени суток.
Суть вопроса: Есть строка. Между словами в строке может быть более 1 пробела, что не преемлемо (от пользователей привет, объяснять бесполезно). Требуется удалить лишние пробелы кроме одного. На ум приходит только перебор по символам до конца строки и выявление двойных пробелов путем сравнения текущего символа с предыдущим. Кода пока нет. Только идея в голове вертится... Может кто-нибудь решал нечто подобное. Посимвольный перебор кажется громозким. Исправлено 2 раз(а). Последнее : Jlutko, 12.01.18 17:08 |
Re: Удаление лишних пробелов | |
---|---|
Taran Сообщений: 13623 Откуда: Красноярск Дата регистрации: 16.01.2008 |
P.s. проверить надо. За синтаксис. Давно не писал. Исправлено 1 раз(а). Последнее : Taran, 12.01.18 17:13 |
Re: Удаление лишних пробелов | |
---|---|
Jlutko Автор Сообщений: 161 Откуда: Пермская область Дата регистрации: 27.09.2005 |
Спасибо. Идея понятна (собственно идея и требовалась. С синтаксисом разберемся позже).
Но если больше 2-х пробелов? С юзерами может встретится все, что угодно... |
Re: Удаление лишних пробелов | |
---|---|
ssa Сообщений: 12999 Откуда: Москва Дата регистрации: 23.03.2005 |
А цикл, конечно же, просто от балды поставлен? Это во-первых. А во-вторых, поищи тут по слову Reduce. ------------------ Лень - это неосознанная мудрость. |
Re: Удаление лишних пробелов | |
---|---|
Jlutko Автор Сообщений: 161 Откуда: Пермская область Дата регистрации: 27.09.2005 |
Да, верно, туплю...
|
Re: Удаление лишних пробелов | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
а не быстрей будет, что-то типа (сори за смесь фокспрошного синтаксиса с сишным, я просто фокспро совсем не помню)?
for(i=2;i<strlen(myText);i++) { if !space(i) $ myText break; myText = strtr(myText,space(i), space(1)); } |
Re: Удаление лишних пробелов | |
---|---|
Jlutko Автор Сообщений: 161 Откуда: Пермская область Дата регистрации: 27.09.2005 |
ДА! Все работает!Все корректно!
Проверил на реальной базе. Вышло несколько проходов по строке, но, думаю, это все равно лучше, чем посимвольное сравнение. Спасибо! Странно, но функцию "strtr" я не знал... Дитя MS-DOS! |
Re: Удаление лишних пробелов | |
---|---|
Jlutko Автор Сообщений: 161 Откуда: Пермская область Дата регистрации: 27.09.2005 |
Я в Си не силен. Каюсь. Делфи, фокспро, VBasic - это пожалуйста...
Но, судя по моему подозрению, Вы пытаетесь устроить перебор строки по символам (может я не прав. я еще раз повторю, что в Си я не спец). Но если так, то это то, от чего я хочу уйти. |
Re: Удаление лишних пробелов | |
---|---|
Jlutko Автор Сообщений: 161 Откуда: Пермская область Дата регистрации: 27.09.2005 |
Извиняюсь.
Более внимательно прочитал код... Но как Ваш код может быть воспроизведен на фокспро? Остальное не преемлемо! Я просто пишу доп. функцию к бухгалтерской программе... И на чем ее писать - не мне решать! |
Re: Удаление лишних пробелов | |
---|---|
Taran Сообщений: 13623 Откуда: Красноярск Дата регистрации: 16.01.2008 |
На фокс переложить не проблема.
Строчек будет поболее чем у меня. По скорости наверно тоже минус. У меня проверка при входе в цикл. У spinza внутри цикла. Если и будет разница, то семечки. |
Re: Удаление лишних пробелов | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
Хм, кстати, мой код некорректный.
|
Re: Удаление лишних пробелов | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Быстрее будет подключить foxtools и использовать её функцию reduce. Но это всё же внешняя библиотека, таскать с собой ещё и fll придётся - это минус.
------------------ WBR, Igor |
Re: Удаление лишних пробелов | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
Все же при реализации на "быстрых" ЯП, типа Си/ассемблера, посимвольный анализ строки кажется самым оптимальным в общем случае. Да, думаю, для длинных мегабайтных строк с длинными последовательностями пробелов и при реализации на фокспро это тоже будет оптимальным вариантом.
|
Re: Удаление лишних пробелов | |
---|---|
leonid Сообщений: 3202 Откуда: Рига Дата регистрации: 03.02.2006 |
Вот так будет быстрей всего
|
Re: Удаление лишних пробелов | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
2leonid
Большая просьба в таких случаях выкладывать попутно ассемблерный код. Ну долго же переводить маш.коды в мнемонику. |
Re: Удаление лишних пробелов | |
---|---|
leonid Сообщений: 3202 Откуда: Рига Дата регистрации: 03.02.2006 |
Его же еще искать надо.
|
Re: Удаление лишних пробелов | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
Я бы все же сделал реализацию на "строковых" инструкциях х86 (SCASB, MOVSB), это должно
работать быстрей. Исправлено 2 раз(а). Последнее : spinz, 12.01.18 23:27 |
Re: Удаление лишних пробелов | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Полагаю, что конкретно так усилив "логику" подобного кода, можно получить очень заметное ускорение. ХитрО манипулировать DWORD-ами а не байтами (a-la "быстрые" сишные реализации memcpy), читать/писать память "по границе слова", "схлопывать" существующую строку (а не копировать ещё раз "в новую" - хотя фокс всё одно при вызове dll для "ссылочной строки" будет дважды копировать содержимое)... Используя FoxAPI или влазя во внутренности рантайма можно, вероятно, избежать и начальных "копирований" и копирований внутри LEFT-а, который, я так думаю, без выделения нового блока памяти и копирования символов не обходится (но как тогда избежать утечки памяти - тот ещё вопрос)...
Естественно это всё имеет чисто спортивный интерес, т.к. для типичных применений - "облагородить" ввод юзером весьма коротких строк-наименований - даже жутко неэффективный "цикл замены двух пробелов на один до достижения результата" вполне себе подойдёт ------------------ WBR, Igor |
Re: Удаление лишних пробелов | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Вряд ли заметно быстрее (на современном железе, конечно, впрочем VFP на старых добрых 80286 и не работает ). Основной тормоз IMHO будет в чтении/записи памяти - побайтно, да без "выравнивания" это делать крайне невыгодно... ------------------ WBR, Igor |
Re: Удаление лишних пробелов | |
---|---|
leonid Сообщений: 3202 Откуда: Рига Дата регистрации: 03.02.2006 |
Так кто ж мешает то? Заодно бы и сравнили. Может как раз все наоборот. |
© 2000-2024 Fox Club  |