инверсия строки
Например было "апрол" стало "лорпа".
Как сделать инверсия строки и поместить результат в опр. переменную.
Например было "апрол" стало "лорпа".
...
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), в буфере инвертированная строка
Вызываеш Invert(buf), в буфере инвертированная строка
Зачем же так-то? :o
{
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;
}
}
Зачем же так-то? :o
{
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
{
for(char* last = buf + strlen(buf) - 1; buf != last && buf < last; buf++, last--)
std::swap(*buf, *last);
}
да какая разница, все равно нужно использовать стандартные функции. Если и извращаться, то уж лучше так :D
{
for(char* last = buf + strlen(buf) - 1; buf != last && buf < last; buf++, last--)
std::swap(*buf, *last);
}
Мона и без стандартных
{
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)
}
}
Мона и без стандартных
{
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)
}
}
А я имел ввиду, что зачем изобретать велосипед, если и так есть функция strrev? Да, через new было конечно сильно... На асме тоже можно (не намного больше получается, кстати :D )
{
__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
}
}
{
__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
}
}
Нормально :)
Только уж тода
xor al, al
repnz scas edi, al
dec edi
Нормально :)
Только уж тода
xor al, al
repnz scas edi, al
dec edi
Это что?
Это что?
Извиняюсь, асма давно не видел. Вот так конечна.
xor al, al
repnz scasb
dec edi
Длина строки это.
Извиняюсь, асма давно не видел. Вот так конечна.
xor al, al
repnz scasb
dec edi
Длина строки это.
я тоже асма давно не видел.... Но тогда уж так:
xor al, al
xor ecx, ecx
dec ecx
str_len:
inc ecx
scasb
jnz str_len
Вспомним, что такое rep? А это означает-то, что иструкция должна выполниться (e)cx число раз...
Вспомним, что такое rep? А это означает-то, что иструкция должна выполниться (e)cx число раз...
Я всегда думал что repnz повторяет команду пока cx содержит ненулевое значение и флаг ZF равен 0. scasb вычитает из al [edi] Если они равны, то ZF устанавливается. (di увеличивается или уменьшаетя (в зависимости от какого-то флага (df, что-ли?) на 1 при rep(z, nz)) Здесь конечно надо cx задать какое-нибудь большое. Т.е. если вот так вот написать
mov edi, buf
xor al, al
cld
repnz scasb
dec edi
то edi на последний символ в строке должен указывать.
Я всегда думал что repnz повторяет команду пока cx содержит ненулевое значение и флаг ZF равен 0.
А кто спорит? Только ecx уменьшается после каждой инструкции...
scasb вычитает из al [edi] Если они равны, то ZF устанавливается. (di увеличивается или уменьшаетя (в зависимости от какого-то флага df, что-ли?) на 1 при rep(z, nz))
Именно так... Вот только Intel говорит, все таки, не вычитает, а сравнивает [edi] и al... Хотя скорее всего делается это действительно через вычитание...
Здесь конечно надо cx задать какое-нибудь большое. Т.е. если вот так вот написать
mov edi, buf
xor al, al
cld
repnz scasb
dec edi
то edi на последний символ в строке должен указывать.
Все верно...
А длину строки теперь можно посчитать
как
Только не в том форуме мы спор развели :)
А кто спорит? Только ecx уменьшается после каждой инструкции...
Именно так... Вот только Intel говорит, все таки, не вычитает, а сравнивает [edi] и al... Хотя скорее всего делается это действительно через вычитание...
Все верно...
А длину строки теперь можно посчитать
как
Только не в том форуме мы спор развели :)
У VC++ есть функция инверсии строки
CString str="asdf";
str.MakeReverse( );
/* и тогда str равно "fdsa" */
У VC++ есть функция инверсии строки
CString str="asdf";
str.MakeReverse( );
/* и тогда str равно "fdsa" */
Ну вот млин... и зачем-же мы тут... :)