00:48

100 бед - 1 ресет
Как написать на Си функцию замены двух слов местами в строке.. или может есть готовая функция?? Выручайте..

Комментарии
02.11.2005 в 01:21

149ea694a792f3ad2caaf77077a0df58 Спорящая с богом
Напрямую никак... Примерный план функции такой:

1. Создать новую строку

2. Переписать туда кусок исходной строки перед искомыми словами

3. Переписать второе слово

4. Переписать кусок между словами

5. Переписать первое слово

6. Переписать конец строки

7. Удалить старую строку

8. Перенастроить указатель н новую строку



Долго, муторно, но другого способа в Си нет. В языках более высокого уровня можно воспользоваться MergeCollections и конкатенацией строк, но это будет лишь видимая оболчка, внутри всё равно всё будет идти по тому же плану.
02.11.2005 в 01:25

Ты меня опередила =))
02.11.2005 в 01:30

Алексей
Если сильно изощриться - можно и напрямую, но нафиг оно не нужно.
02.11.2005 в 01:36

149ea694a792f3ad2caaf77077a0df58 Спорящая с богом
alexp

Без дополнительных затрат памяти? Хотя бы две темповых переменных - для хранения первого слова и хранения подстроки между словами - хоть тресни, но заводить надо. Это ж не числовые значения, которые в извращённой форме можно обменивать без дополнительной переменной.
02.11.2005 в 01:51

Алексей
Здрасте! А аски код это что? Не цифра? Но я извращения такой степени не подразумевал. Я имел в виду с переменной. И если уж на то пошло, то все-таки дополнительная переменная и дополнительная строка - это разные вещи. ;)
02.11.2005 в 02:16

149ea694a792f3ad2caaf77077a0df58 Спорящая с богом
alexp

аски-код - цифра, а вот строка - ни разу ни цифра. У них длины разные бывают;о) Дополнительная переменная как таковая тебя не спасёт по вышеуказанной причине, здесь годится только динамический массив. Если сможешь привести пример доказывающий обратное - поименую гуру и при встрече угощу пивом;о)
02.11.2005 в 02:26

Алексей
Ну меня аж начали сомнения терзать... :)

Кого мы по-русски называем строкой? string? он же char* терминирующийся нулем?



(я не издеваюсь, я просто это добро только на иврите и на инглише привык воспринимать)
02.11.2005 в 07:17

Fire in a hole!
alexp поскольку речь о сях, то, видимо таки char* терминированный нулём :)
02.11.2005 в 08:21

149ea694a792f3ad2caaf77077a0df58 Спорящая с богом
alexp

Я по некоторым темам (особенно по теории операционных систем) страда. теми же проблемами;о)

Да, имеется в виду классическая строка в стиле Си, т.е. zero-based char*.
02.11.2005 в 19:31

Алексей
Ну а тогда в чем проблем? Длина строки нас не волнует: перебераем байтики пока не найдем нолик. :)
02.11.2005 в 20:06

149ea694a792f3ad2caaf77077a0df58 Спорящая с богом
alexp

Напиши имлиментацию без воспомогательных строк. Я хочу это видеть.
04.11.2005 в 20:25

Алексей
После тяжелой рабочей недели мне думать лень, но за себя я постою.

Вот: http://alexei-p.pisem.net/Swap%20Words.zip

Может и криво написано (как я уже сказал: думать лень), но замена происходит без дополнительных контейнеров. Ни один байт ни на секунду не покидает строки. Вспомогательными используются два поинтера и два каунтера. Если подумать чуть-чуть, то наверно можно и меньше.



ПС. Поскольку пива я не пью, согласен на чай с вареньем :)
04.11.2005 в 23:09

149ea694a792f3ad2caaf77077a0df58 Спорящая с богом
alexp

Снимаю шляпу;о) Я уже после написания комментария додумалась до этой идеи, но запуталась в указателях. Твоё решение действительно полное, изящное и предусмотрены все исключительные ситуации. Хотя стиль непривычный, поначалу тяжеловато читать...

Будешь на Адаре - милости просим в гости;о) Какое варенье ты любишь?
04.11.2005 в 23:42

Fire in a hole!
alexp за идею с triple XOR спасибо)



Идея подобного алгоритма была, но над реализацией не думал.
05.11.2005 в 01:32

Алексей
Караидель

Снимаю шляпу;о)

Не надо шляпу снимать. При нынешней погоде можно здорово намокнуть :)



и предусмотрены все исключительные ситуации

Это я не гарантирую. Даже не пытался напрягаться думать, все ли случаи учтены. Те возможные ошибки, что пришли в голову по ходу - я проверил, но может есть еще.



Хотя стиль непривычный, поначалу тяжеловато читать...

А что мешало читать?



Будешь на Адаре - милости просим в гости;о) Какое варенье ты любишь?

Буду рад :) Варенье - вишневое с ягодами :)



Neiru

за идею с triple XOR спасибо)

Пожалуйста :) Более понятный и читабельный вариант выглядит так:

a ^= b;

b ^= a;

a ^= b;

05.11.2005 в 02:36

149ea694a792f3ad2caaf77077a0df58 Спорящая с богом
alexp

Непривычные заголовки функций, и фигурные скобки я иначе ставлю.

Варенье в воскресенье куплю;о)
05.11.2005 в 03:39

Алексей
Непривычные заголовки функций

Мне когда-то тож было непривычно. Но так список параметров выглядит разборчивее и можно к каждому напротив коммент приписать, как и к возвращаемому значению.



и фигурные скобки я иначе ставлю

А это у меня не обоснованная привычка. Перецепил это из Джавы. Мне так удобнее, хотя переносить фигурную скобку в начало следующей строки, пожалуй целесообразнее.



Варенье в воскресенье куплю

Гуд! Я в Хайфе каждые выходные :)