Показать сообщение отдельно
Старый 26.06.2015, 13:09   #1
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
ненависть: strtok

strtok

Никогда этой функцией не пользовался, так как всегда была возможность реализовать контекстно более рациональный механизм работы с токенами. А тут представилась свободная минутка почитать про эту непотокобезопасную, нереентерабельную жуть. Фиг бы с ним (зачастую) с потоками, да даже и для нереентерабельности, скрепя сердце, можно найти оправдание... ЭТА ШТА ТАКОЭ:
char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
(http://www.cplusplus.com/reference/cstring/strtok/)
Может функция возвращает указатели на токены, создавая их в куче? Нет - судя по адресам - указатели непосредственно на байты исходной строки. Но ведь она может быть const (хоть, согласно костылю стандарта, может быть объявлена и без соответствующего спецификатора) - а для закрытия токена необходимо перезаписать ближайший разделитель терминатором. Подобное надругательство у Страуструпа комментируется как "ошибки, обычно не выявляющиеся до стадии выполнения программы" и отмечается зависимость поведения от реализации. Так же упомянуто в разделе "Нежелательные особенности".
Всё что нужно, чтобы уронить программу, оформить обрабатываемую строку как литерал:
char *str ="- This, a sample string.";
Спецификатора const нет - ошибок при сборке нет - крах есть.
Не пользовался и не буду

Нафиг такую муть в стандартную либу пихать, посоны?
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием