· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.A&O —› Нахождение подстроки в строке

. 1 . 2 . 3 . >>

Посл.отвђт Сообщенiе


Дата: Авг 26, 2003 20:46:57

Хотелось бы в общем поднять и эту тему. Она очень нужна всем тем, кто парсит коммандную строку, файл, черта лысого.
Вот мой случай - надо удалить все пробелы в строке. Строка может начинаться с пробелов, может состоять из одних пробелов, может заканчиваться на пробелы. Сама строка пробелов содержать в себе не должна. Пример:

" I_am_the_string"
"I_am_the_string "
" "
"I_am_the_string"

Во всех четерых случаях должен быть один и тот же результат: "I_am_the_string".
Очевидно, тупое нахождение пробелов здесь не подходит. Вернее, сделать-то можно и даже просто, но скорость будет...
Алгоритмизаторы, у кого есть какие идеи? Конечные автоматы? Что?


Дата: Авг 26, 2003 20:57:10

Что-то не понял, в чём тут проблема, на Перле всё должно быть легко ;-)
Только я не понял, что нужно, все пробелы заменить на '_'?


Дата: Авг 26, 2003 21:07:15

Во-первых, я работаю не на Перле сейчас, а на С. Во-вторых, регулярные выражения перла тоже построены на принципе конечных автоматов, как мне кажется. В-третьих, мне интерестно увидеть суть!


Дата: Авг 26, 2003 21:07:45

volodya
Хоть ты иговоришь, что тупое нахождение пробелов
не рулит, но самый простой способ, как не странно вот:
.data
in_str db ' 123_str_всякая_лажа   ',0
out_str db 15 dup(?)
.code
_start:
      ....
      .... 
      mov esi,offset in_str
      mov edi,offset out_str
_loop_:
      .if byte ptr[esi]!=0
        .if byte ptr[esi]!=20h
         mov al,byte ptr[esi]
         mov byte ptr[edi],al
        .endif
      jmp short _loop_
      .endif
      ....
      ....    
      end _start


Дата: Авг 26, 2003 21:13:56

KiNDeR

Черт, терпеть не могу этот синтаксис... По-моему, цикл бесконечен - это раз. А во-вторых, вероятно, он не оптимален. А в третьих - глянь туда -
http://algolist.manual.ru/search/esearch/index.php


Дата: Авг 26, 2003 21:21:24

volodya

Чем синтаксис-то не понравился? ;-)
Единственное что я не уважаю в исходниках это "_"


Дата: Авг 26, 2003 21:25:18

Asterix

Я имею в виду не синтаксис KiNDeR, у него-то с синтаксисом проблем нет. Я имею в виду эти придурошные макроопределения. Макросы хороши, но не надо ж до абсурда доводить. Покажи вот эту строку .if byte ptr[esi]!=0
любому программеру на С - так он скажет: "и это писал ассемблерщик???". Это ж позор. Извращение самой сути языка. Ты видел как в примере о заголовке MZ к структурам доступаются? Да на хер мне такой ассемблер нужен? Я на С напишу за две минуты! На асме буду как положено [esi+4] делать!
Однако ты меня отвлек! Как там на счет подстроки в строке?


Дата: Авг 26, 2003 21:51:22

volodya
Приношу свои извенения, за корявоть синтаксиса.
По ссылочки я сходил. Очень познавательная статья. Спасибо.
Я думал изночально о таком коде(хотя ты его зарубил на корню)
      mov esi,offset in_str
      mov edi,offset out_str
_loop_:
       cmp byte ptr[esi],0
       je _exit_process
       cmp byte ptr [esi],20h
       je _go_
       mov al,byte ptr [esi]
       mov byte ptr [edi],al
       inc edi
_go_:
       inc esi
       jmp short _loop_   


Дата: Авг 26, 2003 22:26:45

KiNDeR

Ты забыл в конце строки нолик поставить. А в остальном - хороший нормальный самый обычный алгоритм. Очень прост в реализации. На Си, кстати, пришлось бы руки выкручивать. Но, все равно, а что если строка здоровая? Подсчитай, сколько у тебя уйдет сравнений?

Или, может, меня и в самом деле глючит и не надо изобретать велосипед там, где его нет. Но есть же алгоритм Кнута-Морисса-Пратта и другие страшные вещи... Не все ж так просто. Эдмонд, где ты?


Дата: Авг 27, 2003 07:31:59

volodya
Хотелось бы в общем поднять и эту тему.
Если надо просто найти подстроку - смотрите реализацию strstr. Если надо парсить строку в общем случае, то убирание пробелов - не самая подходящая задача для обсуждения.

Очевидно, тупое нахождение пробелов здесь не подходит. Вернее, сделать-то можно и даже просто, но скорость будет...
По-моему, нормальная будет скорость: для поиска пробелов и определения группы пробелов используем scasb, а удаляем пробелы методом, описанным в моём сообщении по теме "Мне бы сортировочку".


Дата: Авг 27, 2003 14:24:14

Гы, оказывается удаление пробелов популярная задача. Я в свое время писал это так:
;; compile: nasmw.exe -o s_strip.obj -f coff s_strip.asm
;; s_out can be same string as s_inp

bits 32
section .text

global  _s_strip

;; void __cdecl s_strip(char* s_inp, char* s_out);
_s_strip:
        mov     edx, dword [esp+4]      ;; s_inp
        mov     ecx, dword [esp+8]      ;; s_out
.c_skip:
        movzx   eax, byte [edx]
        inc     edx
        cmp     eax, byte 0x20          ;; ' '
        jz      short .s_skip
        mov     byte [ecx], al
        inc     ecx
        test    eax, eax
        jnz     short .c_skip
        retn


Дата: Авг 27, 2003 21:42:36 · Поправил: Johnikum

на чистом асме:
+ удаление пробелов в начале и в конце
на выходе в eax - адрес строки
DelStringSpace	proc near
	mov	esi,(адрес строки)
	push	esi

	push	esi
	call	GetStringLength
	or	eax,eax
	jz	DSS_exit

	mov	edi,esi
	cld
	mov	ecx,-1
	mov	al,' '
	repe	scasb
	dec	edi
	xchg	esi,edi
DSS_Find:
	lodsb
	cmp	al,' '
	jne	DSS_Replace
	stosb
DSS_NextSpace:
	lodsb
	cmp	al,' '
	je	DSS_NextSpace
DSS_Replace:
	stosb
	or	al,al
	jnz	DSS_Find

	dec	edi
	dec	edi
	cmp	bpt [edi],' '
	jne	DSS_exit
	stosb
DSS_exit:
	pop	eax
	ret
DelStringSpace	endp


Дата: Авг 27, 2003 21:44:35 · Поправил: volodya

ОК, пойдет. Скоро разрожусь сишным вариантом.


Дата: Авг 27, 2003 22:49:12

volodya

Наблюдаю как ты ищешь изюминку в куче кода :) и такой вопрос
у меня созрел, а как ты тестируешь этот код на профпригодность,
ну т.е. скорость работы, пожираемые ресурсы и т.д.


Дата: Авг 27, 2003 22:59:13

Asterix

А я писал статью о профилировщиках - ушла в рассылку когда-то, но так на сайте и не появилась. Лови:

http://subscribe.ru/archive/comp.soft.prog.hitech/200302/17182545.html - там лежит пошкарябаная копия.

Если ее сейчас класть на сайт - я бы там кое-что пересмотрел.

. 1 . 2 . 3 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.138