Консультация № 142358
26.08.2008, 22:50
0.00 руб.
0 6 1
Стало интересно, можно ли развернуть строку на месте, не используя дополнительну память
Например: char str[] = "hello"; превратилось в "olleh". Возможен ли такой разворот? Если нет, то приведите пример с минимальным использованием памяти.
Заранее спасибо за ответы =)

Приложение:
PS в ассемблере строку можно "развернуть" с помощью флагов направления

Обсуждение

давно
Старший Модератор
31795
6196
26.08.2008, 22:58
общий
Подумайте об операции XOR.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
26.08.2008, 23:18
общий
Нет нельзя. В асемблере тоже нельзя - там просто меняется направление
обхода строки. Если Вам нужно именно это используйте ассемблерные вставки.
Удачи!
Неизвестный
27.08.2008, 04:54
общий
это ответ
Здравствуйте, Xeladen!
Для этого можно выполнить обычный реверс строки. В качестве элемента для обмена символов можно использовать элемент строки содержащий '\0'. Вот и пример.
Код:
 #include <string.h>

int main(int argc, char* argv[]) {

char str[] = "Hello";

int len = (int)strlen(str);

for(int i=len/2; i>=0; i--) {

str[len] = str[i];
str[i] = str[len-i-1];
str[len-i-1] = str[len];
}

str[len] = '\0';

return 0;
}
Неизвестный
27.08.2008, 10:07
общий
В асемблере тоже нельзя - там просто меняется направление
обхода строки. Если Вам нужно именно это используйте ассемблерные вставки.
Удачи!

Именно по этому я написал слово "развернуть" в ковычках
давно
Академик
20764
1861
27.08.2008, 16:33
общий
kool: Можно!
Вот если бы был char const str[] или char const * str (даже без второго const), то на порядочных платформах нельзя даже с использованием cast-преобразований, так как значение располагалось бы в сегменте readonly

btw, для gnu cc есть специальный ключ, делающий строки-литералы доступными для записи.
Неизвестный
27.08.2008, 22:51
общий
Пример в студию!
Форма ответа