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

 WASM Phorum —› WASM.WIN32 —› Строки...

. 1 . 2 . >>

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


Дата: Апр 7, 2004 16:09:20

Здравствуйте!
У меня есть небольшой вопрос по работе
со строками. (Очень понадобилось).
Я формирую строку и поэтому не знаю, какое
колличество символов в строке уже есть.
Вопрос такой. Как из строки вида:
C:\someth\*.txt
преобразовать в:
C:\someth\
Т.е. удалить четыре последних символа.
Нужно обязательно реализовывать поиск по строке?
(Сорсы привествуются ;)
Заранее спасибо!
1990


Дата: Апр 7, 2004 17:02:03 · Поправил: PavPS

Привет! когда я решал программу по "прогулке" по дереву каталогов и поиску файлов (помоему, такая же задача и перед тобой) приходилось пользоваться примерно следующим:
Mov AL,ord("/") ; :)
Mov ECX,Len_of_string
Mov EDI,string_begin_pointer
add edi,ecx
dec edi
std
rep scasb
mov byte ptr [edi],0
т.о. завершили строку нулем


Дата: Апр 7, 2004 17:04:02

> Я формирую строку и поэтому не знаю, какое
колличество символов в строке уже есть.


lstrlen - рулит ;-) Но ещё ряд других функций, которые получают откуда-либо строку в eax возвращают длину. Поэтому читаем хотя бы справку по API, ну или MSDN.

> Т.е. удалить четыре последних символа.
mov edi, OFFSET szString
invoke lstrlen, edi
mov ecx, eax
lea edi, [edi+eax-1]
mov al, '\'
std
repne scasb
mov BYTE PTR [edi+2], 0


Дата: Апр 7, 2004 17:21:49
Правка

Asterix
Кстати, а почему lstrlen маленькая (при дизассемблировании или отладке), а в сорцах crt
кода раза в 3-4 больше?


Дата: Апр 7, 2004 17:34:53

Большое спасибо за сорсы! Топерь быстрее дело пойдёт.

Asterix
lstrlen - рулит!

IceStudent
Да, вопрос интересный...


Дата: Апр 7, 2004 17:39:30 · Поправил: PavPS

Тема не моя, но позволю себе задать Всем вопрос:
если разговор пошел об lstrlen, то почему она ищет конец строки:
aaa:
Mov CL,byte ptr [EAX]
Inc EAX
Test CL,CL
JNZ aaa
????
неужели через "REP SCAS" не быстрее???


Дата: Апр 7, 2004 17:55:35

Asterix
Можно тебе намылить один вопрос? Какой твой майл? (Если не сложно).
1990


Дата: Апр 7, 2004 18:09:35

PavPS
Через REP короче, но не быстрее ;-)

IceStudent
Это свойственно CRT. Не удивлюсь, если в рантайме сначала проверяется не нулевой ли указатель на строку, устанавливается обработчик исключений на случай нечитабельности памяти и т.д.


Дата: Апр 7, 2004 18:30:31

1990

Ну если ты немного разуешь глаза и найдёшь таки мой mail, то можешь написать мне письмо, и если твоё письмо всё-таки преодолеет те заградительные антиспамовые фильтры что я понаставил, то я отвечу на твой вопрос, если он конечно в моей компетенции ;-)


Дата: Апр 7, 2004 18:43:35

Для win98 :-)
_FREQASM:BFF773A9 ; int __stdcall lstrlenA(LPCSTR lpString)
_FREQASM:BFF773A9                 public lstrlenA
_FREQASM:BFF773A9 lstrlenA        proc near               ; CODE XREF: sub_BFFB38B7+65p
_FREQASM:BFF773A9 
_FREQASM:BFF773A9 lpString        = dword ptr  14h
_FREQASM:BFF773A9 
_FREQASM:BFF773A9                 push    ebx             ; lstrlen
_FREQASM:BFF773AA                 push    esi
_FREQASM:BFF773AB                 push    edi
_FREQASM:BFF773AC                 push    ebp
_FREQASM:BFF773AD                 push    0F1h
_FREQASM:BFF773B2                 push    offset loc_BFFA1D67
_FREQASM:BFF773B7                 push    large dword ptr fs:0
_FREQASM:BFF773BE                 mov     large fs:0, esp
_FREQASM:BFF773C5                 mov     eax, esp
_FREQASM:BFF773C7                 push    dword ptr [eax+20h]
_FREQASM:BFF773CA                 call    sub_BFF71170
_FREQASM:BFF773CF                 pop     large dword ptr fs:0
_FREQASM:BFF773D6                 add     esp, 8
_FREQASM:BFF773D9                 pop     ebp
_FREQASM:BFF773DA                 pop     edi
_FREQASM:BFF773DB                 pop     esi
_FREQASM:BFF773DC                 pop     ebx
_FREQASM:BFF773DD                 retn    4
_FREQASM:BFF773DD lstrlenA        endp

_FREQASM:BFF71170 sub_BFF71170    proc near               ; CODE XREF: sub_BFF737E4+17p
_FREQASM:BFF71170                                         ; sub_BFF73D99+45p ...
_FREQASM:BFF71170 
_FREQASM:BFF71170 arg_0           = dword ptr  8
_FREQASM:BFF71170 
_FREQASM:BFF71170                 push    ebp
_FREQASM:BFF71171                 mov     ebp, esp
_FREQASM:BFF71173                 push    ecx
_FREQASM:BFF71174                 push    edi
_FREQASM:BFF71175                 mov     edi, [ebp+arg_0]
_FREQASM:BFF71178                 or      ecx, 0FFFFFFFFh
_FREQASM:BFF7117B                 xor     eax, eax
_FREQASM:BFF7117D                 cld
_FREQASM:BFF7117E                 repne scasb
_FREQASM:BFF71180                 or      eax, 0FFFFFFFEh
_FREQASM:BFF71183                 sub     eax, ecx
_FREQASM:BFF71185                 pop     edi
_FREQASM:BFF71186                 pop     ecx
_FREQASM:BFF71187                 leave
_FREQASM:BFF71188                 retn    4
_FREQASM:BFF71188 sub_BFF71170    endp


Дата: Апр 7, 2004 19:02:07 · Поправил: 1990

Asterix
Ну, разуть глаза я не смог. дело вот в чём (если не хочешь по майлу) - у меня строка не собирается, после использования твоего кода... Подробнее - только сам сорс, поэтому про майл и спросил, может, думаю, подкинешь идею по восстановлению строки...


Дата: Апр 7, 2004 19:17:53

Проблема не исчерпана!

Asterix
Кстати, а код этот оказывается вообще нерабочий. Так что не знаю что делать. Под w2k вызывает ошибку.
Мыло мне твоё искать лень. ;)

PavPS
Под MASM скомпилировать не смог. Может быть как-то нужно видоизменить код?

1990


Дата: Апр 7, 2004 20:13:19

1990

Само-собой код я проверял, да и ошибиться тут невозможно ;-)
Так что проблема в тебе, то бишь в твоём коде ;-)
Возможно ты забыл перед использованием сохранить edi в стеке и потом соответственно его восстановить, угадал?

> Мыло мне твоё искать лень. ;)

Твоё личное дело..


Дата: Апр 7, 2004 20:18:35

Если всё-же захочешь написать, то в разделе "Инструменты" лежит пара моих поделок, там есть mail в архиве =)


Дата: Апр 7, 2004 20:23:58

1990
Тут рабочий исходник. Лови!

_652069304__BackAddr.rar

. 1 . 2 . >>


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