|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Окт 2, 2003 11:49:23 Здравствуйте! Есть вопрос: Как записать строку задом наперёд? Т.е. как из данных/буфера сделать: 123456 в 654321? А как поменять парами, т.е. 214365? (Очень нужно для учёбы.) Заранее спасибо. |
|
|
Дата: Окт 2, 2003 12:06:12 · Поправил: Dr.Golova Наверно как-нибудь вот так:
char* swap_str(char* i_str)
{
int i, s_len, t_len;
char t_chr;
s_len = strlen(i_str);
t_len = (s_len >> 1);
for ( i = 0; i < t_len; i++ )
{
t_chr = i_str[i];
i_str[i] = i_str[--s_len];
i_str[s_len] = t_chr;
}
return(i_str);
}
а парами еще проще:
char* swap_str2(char* i_str)
{
int i, s_len;
char t_chr;
s_len = strlen(i_str) & -2;
for ( i = 0; i < s_len; i += 2 )
{
t_chr = i_str[i];
i_str[i] = i_str[i+1];
i_str[i+1] = t_chr;
}
return(i_str);
}
|
|
|
Дата: Окт 2, 2003 12:39:24 Если извесна длина введеных символов, то примерно так: ; в ecx длинна строки mov esi,offset InStr mov edi,offset OutStr _scan: mov al,byte ptr [esi+ecx-1] mov byte ptr[edi],al inc edi dec ecx jnz _scan |
|
|
Дата: Окт 2, 2003 14:18:44 > Если извесна длина введеных символов, то примерно так: А помойму так получится таже самая строка :) |
|
|
Дата: Окт 2, 2003 14:29:33 А помойму так получится таже самая строка :) Dr.Golova А ты проверь :))
;
;
.386
.MODEL flat, stdcall
option casemap:none
;
; ###################################################################### ###
;
includelib kernel32.lib
includelib user32.lib
include kernel32.inc
include user32.inc
;
; ###################################################################### ###
;
;
.DATA
;
hInst dd ?
InStr db '1234',0
OutStr db 5 dup(0)
;
.CODE
_start:
mov ecx,4
mov esi,offset InStr
mov edi,offset OutStr
_scan:
mov al,byte ptr [esi+ecx-1]
mov byte ptr[edi],al
inc edi
dec ecx
jnz _scan
push 0
push offset InStr
push offset OutStr
push 0
call MessageBox
_exit_process:
push 0
call ExitProcess
;
end _start
1709694575__Testw.exe |
|
|
Дата: Окт 2, 2003 14:58:27 KiNDeR Это ты так на masm32 переходишь, нехорошо :-) Сейчас же поменяй call на invoke :-))) |
|
|
Дата: Окт 2, 2003 15:33:21 Asterix Я не люблю invoke мне call роднее. Настольгия мучает...:))) |
|
|
Дата: Окт 2, 2003 15:39:59
revstr proc lpszSource:DWORD,lpszDest:DWORD
push edi
invoke StrLen,lpszSource
mov ecx, lpszSource
lea edx,[ecx-1]
lea ecx,[eax][ecx-1]
mov edi, lpszDest
@@:
mov al, [ecx]
dec ecx
mov [edi], al
inc edi
cmp ecx, edx
jne @B
mov byte ptr [edi],0
pop edi
ret
revstr endp
|
|
|
Дата: Окт 2, 2003 16:09:50 Благодарю. Вы мне очень помогли. |
|
|
Дата: Окт 2, 2003 16:31:40 А всё же, как же парами? Dr.Golova привёл пример, а я на C++ не понимаю, можно на асм. Ещё раз спасибо. А как стать "Красногвардеец Дзёна"? Очень мне это звание понравилось. ;) |
|
|
Дата: Окт 2, 2003 16:34:46 1990 А как стать "Красногвардеец Дзёна"? Это именное. Спроси у comrade, не будет ли он против :). |
|
|
Дата: Окт 2, 2003 17:30:36 · Поправил: Безпощадный даос [ 1990: А всё же, как же парами?] Если KiNDeR не против то слегка подправив его пример будет тебе парами :-) .CODE
start:
mov esi,offset string
mov edi,offset OutStr
invoke lstrlen,esi
mov ecx,eax
shr eax,1 ; А это на случай,
jnc @F ; если строка имеет не четную
dec ecx ; длинну. :)))
@@:
mov ax,word ptr [esi+ecx-2]
mov word ptr[edi],ax
inc edi
inc edi
dec ecx
dec ecx
jnz @B
invoke MessageBox,0,offset OutStr,offset string,0
invoke ExitProcess,0
end start
А вообще в этом коде есть один баг, если строка имеет не чётное количество байт, то пример работать не будет. А теперь должен работать на любых строках. Asterix прости за вольность. :))) |
|
|
Дата: Окт 2, 2003 18:33:49 Dr.Golova А я вообще делаю ему замечание за исспользование не Дзенского Языка %)))))))))))) |
|
|
Дата: Окт 3, 2003 10:08:39 Спасибо! Теперь я немного разбираюсь как работать со строкой. Примеры продвинули меня вперёд >>>! А когда-нибудь, надеюсь, подберу себе "именное" звание. ;) Думаю, что тему стоит закрыть. |
|
|
Дата: Окт 3, 2003 11:56:38 Нет! Я ошибался. Тему ещё не стоит закрыть. Пример от Asterix не работает на XP машине. Не подскажите что это может быть? Строка не изеняется. Вот сорс. Может быть я что сделал не так? 479278564__2.asm |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.115 |