Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

инверсия строки

1.8K
01 апреля 2006 года
Death Knight
139 / / 19.02.2006
Как сделать инверсия строки и поместить результат в опр. переменную.
Например было "апрол" стало "лорпа".
15K
02 апреля 2006 года
Bora
13 / / 22.03.2006
Цитата:
Originally posted by Death Knight
Как сделать инверсия строки и поместить результат в опр. переменную.
Например было "апрол" стало "лорпа".


Код:
#include <string.h>
...
void Invert(char *buf)
{
    int size=strlen(buf);
    char *tmp=new char[size];
    strcpy(tmp,buf);
    int i=0;
    for(i=0;i<size;i++)
    {
        buf=tmp[size-i];
    }
    delete[] tmp;
}


Вызываеш Invert(buf), в буфере инвертированная строка
1.8K
02 апреля 2006 года
Death Knight
139 / / 19.02.2006
Спасибо за ответ.
406
03 апреля 2006 года
vitaly2003s
481 / / 27.07.2004
Dlya etogo sushestvuet bibliotechnaya funkciya: strrev
16K
04 апреля 2006 года
baltika
15 / / 04.04.2006
Цитата:
Originally posted by Bora
Вызываеш Invert(buf), в буфере инвертированная строка


Зачем же так-то? :o

Код:
void Invert(char *buf)
{
    int lastChar, centerChar;
    char tmp;
    centerChar = (lastChar = strlen(buf) - 1) / 2;
    for (int i = 0; i < centerChar; i++)
    {
        tmp = buf;
        buf = buf[lastChar - i];
        buf[lastChar - i] = tmp;
    }
}
395
04 апреля 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by baltika
Зачем же так-то? :o
Код:
void Invert(char *buf)
{
    int lastChar, centerChar;
    char tmp;
    centerChar = (lastChar = strlen(buf) - 1) / 2;
    for (int i = 0; i < centerChar; i++)
    {
        tmp = buf;
        buf = buf[lastChar - i];
        buf[lastChar - i] = tmp;
    }
}


да какая разница, все равно нужно использовать стандартные функции. Если и извращаться, то уж лучше так :D

 
Код:
void Invert(char *buf)
{
  for(char* last = buf + strlen(buf) - 1; buf != last && buf < last; buf++, last--)
    std::swap(*buf, *last);
}
16K
04 апреля 2006 года
baltika
15 / / 04.04.2006
Цитата:
Originally posted by RelB
да какая разница, все равно нужно использовать стандартные функции. Если и извращаться, то уж лучше так :D
 
Код:
void Invert(char *buf)
{
  for(char* last = buf + strlen(buf) - 1; buf != last && buf < last; buf++, last--)
    std::swap(*buf, *last);
}


Мона и без стандартных

Код:
void Invert(char *buf)
{
   char* fCh, lCh;
   char tmp;
   if (buf && buf[0])
   {
       fCh = lCh = buf;
       while (++lCh)
          ;
       lCh--;
       do {
           tmp = *fCh;
           *fCh = *lCh;
           *lCh = tmp;
       } while (++fCh < --lCh)
    }      
}
и на асме воще... Но я вооще-то new имел ввиду...
395
04 апреля 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by baltika
Мона и без стандартных
Код:
void Invert(char *buf)
{
   char* fCh, lCh;
   char tmp;
   if (buf && buf[0])
   {
       fCh = lCh = buf;
       while (++lCh)
          ;
       lCh--;
       do {
           tmp = *fCh;
           *fCh = *lCh;
           *lCh = tmp;
       } while (++fCh < --lCh)
    }      
}
и на асме воще... Но я вооще-то new имел ввиду...


А я имел ввиду, что зачем изобретать велосипед, если и так есть функция strrev? Да, через new было конечно сильно... На асме тоже можно (не намного больше получается, кстати :D )

Код:
void Invert(char* buf)
{
  __asm
  {
    cld
    mov esi, buf
    push esi
    xor ecx, ecx
    dec ecx
str_len:
    inc ecx
    lodsb
    test al, al
    jnz str_len

    mov edi, buf
    add edi, ecx
    dec edi
    shr ecx, 1

    pop esi
str_rev:
    mov al, [esi]
    mov ah, [edi]
    mov [edi], al
    mov [esi], ah
    inc esi
    dec edi
    loop str_rev
  }
}
16K
04 апреля 2006 года
baltika
15 / / 04.04.2006
Цитата:
Originally posted by RelB

Код:
void Invert(char* buf)
{
  __asm
  {
    cld
    mov esi, buf
    push esi
    xor ecx, ecx
    dec ecx
str_len:
    inc ecx
    lodsb
    test al, al
    jnz str_len

    mov edi, buf
    add edi, ecx
    dec edi
    shr ecx, 1

    pop esi
str_rev:
    mov al, [esi]
    mov ah, [edi]
    mov [edi], al
    mov [esi], ah
    inc esi
    dec edi
    loop str_rev
  }
}


Нормально :)
Только уж тода

 
Код:
mov edi, buf
xor al, al
repnz scas edi, al
dec edi
395
04 апреля 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by baltika
Нормально :)
Только уж тода
 
Код:
mov edi, buf
xor al, al
repnz scas edi, al
dec edi


Это что?

16K
04 апреля 2006 года
baltika
15 / / 04.04.2006
Цитата:
Originally posted by RelB
Это что?


Извиняюсь, асма давно не видел. Вот так конечна.

 
Код:
mov edi, buf
xor al, al
repnz scasb
dec edi

Длина строки это.
395
04 апреля 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by baltika
Извиняюсь, асма давно не видел. Вот так конечна.
 
Код:
mov edi, buf
xor al, al
repnz scasb
dec edi

Длина строки это.


я тоже асма давно не видел.... Но тогда уж так:

 
Код:
mov edi, buf
   xor al, al
   xor ecx, ecx
   dec ecx
str_len:
   inc ecx
   scasb
   jnz str_len

Вспомним, что такое rep? А это означает-то, что иструкция должна выполниться (e)cx число раз...
16K
04 апреля 2006 года
baltika
15 / / 04.04.2006
Цитата:
Originally posted by RelB
Вспомним, что такое rep? А это означает-то, что иструкция должна выполниться (e)cx число раз...


Я всегда думал что repnz повторяет команду пока cx содержит ненулевое значение и флаг ZF равен 0. scasb вычитает из al [edi] Если они равны, то ZF устанавливается. (di увеличивается или уменьшаетя (в зависимости от какого-то флага (df, что-ли?) на 1 при rep(z, nz)) Здесь конечно надо cx задать какое-нибудь большое. Т.е. если вот так вот написать

 
Код:
mov ecx, 0xffff
mov edi, buf
xor al, al
cld
repnz scasb
dec edi

то edi на последний символ в строке должен указывать.
395
04 апреля 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by baltika
Я всегда думал что repnz повторяет команду пока cx содержит ненулевое значение и флаг ZF равен 0.

А кто спорит? Только ecx уменьшается после каждой инструкции...

Цитата:
Originally posted by baltika
scasb вычитает из al [edi] Если они равны, то ZF устанавливается. (di увеличивается или уменьшаетя (в зависимости от какого-то флага df, что-ли?) на 1 при rep(z, nz))

Именно так... Вот только Intel говорит, все таки, не вычитает, а сравнивает [edi] и al... Хотя скорее всего делается это действительно через вычитание...

Цитата:
Originally posted by baltika
Здесь конечно надо cx задать какое-нибудь большое. Т.е. если вот так вот написать
 
Код:
mov ecx, 0xffff
mov edi, buf
xor al, al
cld
repnz scasb
dec edi

то edi на последний символ в строке должен указывать.

Все верно...
А длину строки теперь можно посчитать
как

 
Код:
sub edi, buf
И в edi теперь длина строки...

Только не в том форуме мы спор развели :)
538
17 апреля 2006 года
AVDEY
188 / / 17.11.2005
Цитата:
Originally posted by RelB
А кто спорит? Только ecx уменьшается после каждой инструкции...
Именно так... Вот только Intel говорит, все таки, не вычитает, а сравнивает [edi] и al... Хотя скорее всего делается это действительно через вычитание...
Все верно...
А длину строки теперь можно посчитать
как
 
Код:
sub edi, buf
И в edi теперь длина строки...

Только не в том форуме мы спор развели :)



У VC++ есть функция инверсии строки
CString str="asdf";
str.MakeReverse( );
/* и тогда str равно "fdsa" */

16K
24 апреля 2006 года
baltika
15 / / 04.04.2006
Цитата:
Originally posted by AVDEY
У VC++ есть функция инверсии строки
CString str="asdf";
str.MakeReverse( );
/* и тогда str равно "fdsa" */

Ну вот млин... и зачем-же мы тут... :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог