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 нет - ошибок при сборке нет - крах есть.
Не пользовался и не буду
Нафиг такую муть в стандартную либу пихать, посоны?