Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет prool ([info]prool)
@ 2016-08-11 18:06:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Программисты в чате есть?
Вот такая конструкция для сдвига строки на 1 позицию ( set это char * )

strcpy(set+5,set+6)


ВЕЗАПНО перестала работать при переходе на на новую Убунте (15.10), то есть с новой версией libc

Что-то поменялось? Это эхо старого прикола с оптимизацией и копированием сзади наперед?


(Добавить комментарий)


(Анонимно)
2016-08-11 19:12 (ссылка)
как ругается?

(Ответить) (Ветвь дискуссии)


[info]prool
2016-08-11 19:17 (ссылка)
Ведет себя малоадекватно

Чуть позже я напишу подробнее

(Ответить) (Уровень выше)


[info]prool
2016-08-11 21:11 (ссылка)
ВНЕЗАПНО оказалось, что строки нельзя накладывать друг на друга :)

(Ответить) (Уровень выше)


(Анонимно)
2016-08-11 19:51 (ссылка)
man 3 strcpy

>The strings may not overlap

http://demin.ws/blog/english/2011/07/14/strcpy-on-overlapped-strings/

(Ответить) (Ветвь дискуссии)


[info]prool
2016-08-11 21:10 (ссылка)
Но раньше-то работало :)

Я написал свою strcpy с блекджеком и шлюхами, поведение которой мне известно:

char *strcpy_prool (char *dest, char *src) // function from sources of OS Proolix
{char *cc;
if (dest==NULL) return NULL;
if (src==NULL) return NULL;
cc=dest;
do *dest++ = *src;
while (*src++);
return cc;
}

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]phantom
2016-08-14 00:21 (ссылка)
Сразу видно, Кернигана не читал.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]prool
2016-08-14 08:57 (ссылка)
И Пайка
Читал, но давно

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]phantom
2016-08-15 01:45 (ссылка)
Типа классика жанра strcpy: while(*dst++=*src++);

(Ответить) (Уровень выше)


[info]ketmar
2016-08-11 22:09 (ссылка)
это UB. сам себе буратина.

(Ответить)


[info]wieiner_
2016-08-11 23:43 (ссылка)
а чар там какой? скорее всего копирует двухбайтовыми, а смещение Вы считаете однобайтовыми.
или да, перекрытие при копировании с общего базового адреса как то криво в алгоритме strcpy() обрабатывается. вы копируете с база+6 в база+5, получается адреса при копировании строки откуда и куда перекрываются, а алгоритм этого не учитывает и ломается. вообще опасно программировать -- это ну егго нафих..

(Ответить)


[info]wieiner_
2016-08-11 23:50 (ссылка)
upd. прочитал каменты и открылось мне, что я не оригинален.

(Ответить)