· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Как записать строку задом наперёд?

. 1 . 2 . 3 . >>

Посл.отвђт Сообщен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

. 1 . 2 . 3 . >>


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