Артем
sprata
Mодератор
Завкаф
Карма: +40/-5
Offline
Пол:
Сообщений: 1107
|
|
« : Август 05, 2012, 01:21:29 » |
|
Вполне вероятно, что это старый баян, но лично я был приятно удивлен, когда увидел, как коротко и красиво может быть реализована функция strcpy. Предполагается, что передаются заведомо корректные значения и в строке destination достаточно места, чтобы произвести копирование. char *strcpy (char *destination, const char *source) { // Коротко и красиво }
|
|
|
Записан
|
|
|
|
LazarusLong
Ирландский доброволец
Проректор
Карма: +181/-7
Offline
Пол: Награды:
Сообщений: 6134
Ukrainian by birth, Irish by the grace of God
|
|
« Ответ #1 : Август 05, 2012, 01:31:12 » |
|
Если мне не изменяет склероз этот, и другие алгоритмы я рассказывал в рамках курса "Алгоритмы и структуры данных", когда еще преподавал)) char *strcpy (char *destination, const char *source) { for(int i = 0; (destination[i] = source[i]) != 0; i++); return destination; }
Аналогичные в одну строчку алгоритмы есть и для strlen, strcmp и т.д. Кстати подозреваю, что именно так strcpy и реализована.
|
|
|
Записан
|
Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.
"...Он любил говорить факин щит Когда что-то не так ему Принимал он свой самый ирландский вид И кидался трубкой в жену..."
|
|
|
Артем
sprata
Mодератор
Завкаф
Карма: +40/-5
Offline
Пол:
Сообщений: 1107
|
|
« Ответ #2 : Август 05, 2012, 01:39:38 » |
|
LazarusLong, хороший вариант реализации, короткий, и визуально сразу понятный, но есть еще способ, более короткий, но менее понятный на первый взгляд.
|
|
|
Записан
|
|
|
|
LazarusLong
Ирландский доброволец
Проректор
Карма: +181/-7
Offline
Пол: Награды:
Сообщений: 6134
Ukrainian by birth, Irish by the grace of God
|
|
« Ответ #3 : Август 05, 2012, 08:40:06 » |
|
LazarusLong, хороший вариант реализации, короткий, и визуально сразу понятный, но есть еще способ, более короткий, но менее понятный на первый взгляд.
хм, был уверен, что речь шла именно о том варианте, что я предложил) завтра подумаю, сейчас уже глаза слипаются) ( Отправлено в: Август 05, 2012, 02:41:22 ) вспомнил еще такой вариант char *strcpy (char *destination, const char *source) { char *temp = destination; while(*destination++ = *source++); return temp; }
|
|
|
Записан
|
Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.
"...Он любил говорить факин щит Когда что-то не так ему Принимал он свой самый ирландский вид И кидался трубкой в жену..."
|
|
|
Артем
sprata
Mодератор
Завкаф
Карма: +40/-5
Offline
Пол:
Сообщений: 1107
|
|
« Ответ #4 : Август 06, 2012, 09:34:11 » |
|
Да, именно его я и имел ввиду) По количеству строк он на одну больше, чем предыдущий вариант, но строка, в которой происходит копирование, смотрится всё же компактнее (имхо).
|
|
|
Записан
|
|
|
|
LazarusLong
Ирландский доброволец
Проректор
Карма: +181/-7
Offline
Пол: Награды:
Сообщений: 6134
Ukrainian by birth, Irish by the grace of God
|
|
« Ответ #5 : Август 06, 2012, 09:48:01 » |
|
Вообще мне кажется оба варианта примерно равнозначны, что по использованию памяти. что по вычислительной сложности))
|
|
|
Записан
|
Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.
"...Он любил говорить факин щит Когда что-то не так ему Принимал он свой самый ирландский вид И кидался трубкой в жену..."
|
|
|
tos
|
|
« Ответ #6 : Август 07, 2012, 05:23:05 » |
|
Ребята, вы правда считаете, что код for(int i = 0; (destination = source) != 0; i++); return destination; хорошо понятен с первого взгляда? я вот не понял с первого раза, а где же собственно копирование.
Ну а char *temp = destination; while(*destination++ = *source++); return temp;
вообще адовый угар. Но, все-таки, если такое написано где-нибудь в недрах Буста, то ладно, а вот если в коде именно проекта - то надо давать по шапке
|
|
|
Записан
|
|
|
|
LazarusLong
Ирландский доброволец
Проректор
Карма: +181/-7
Offline
Пол: Награды:
Сообщений: 6134
Ukrainian by birth, Irish by the grace of God
|
|
« Ответ #7 : Август 07, 2012, 07:40:03 » |
|
Ребята, вы правда считаете, что код for(int i = 0; (destination[i] = source[i]) != 0; i++); return destination;
хорошо понятен с первого взгляда? я вот не понял с первого раза, а где же собственно копирование. Ну а char *temp = destination; while(*destination++ = *source++); return temp;
вообще адовый угар. Но, все-таки, если такое написано где-нибудь в недрах Буста, то ладно, а вот если в коде именно проекта - то надо давать по шапке я тебя понимаю, но я нигде не заметил в тексте темы призывов так писать на реальных проектах. Тема называется искусство программирования. Причем здесь ремесло промышленной разработки софта? З.Ы. И да, я считаю, что оба варианта достаточно просты и понятны для любого человека мало-мальски знакомого с тем, как работает адресная арифметика и оператор присваивания. З.Ы. 2. И да, я согласен с тем, что на реальных проектах так писать нельзя.
|
|
|
Записан
|
Когда ему нужно - он русский, когда нужно - украинец, а когда ему ни хрена не нужно - он ирландец.
"...Он любил говорить факин щит Когда что-то не так ему Принимал он свой самый ирландский вид И кидался трубкой в жену..."
|
|
|
|