> char *substr = (char*)malloc( end - begin + 1 );
> strncpy( substr, str+begin, end-begin+1 );
Доработка:
substr[end - begin]=0;
Ибо после "malloc" в буфере будет неизвестно что (она же не очищает буфер), а функция "strncpy" не добавляет в конец строки 0, если такового не встречалось в исходной строке.
Вопрошающему - при работе со строками уделяй большое внимание выделяемому под них буферу. Связано с тем, что формат строки в Паскале и в Си отличатеся в принципе.
Паскаль: [1 байт - длина][до 255 байт - данные...]
Си: [сколько хочешь байт - данные][1 байт - ограничитель строки '\0']
Дабы не попадать в "чужую" память и не вызывать "Segmentation fault" или не ловить в программе уязвимости, основанные на переполнении буфера (подавляющее большинство), всегда выделяй буфер на 1 байт больше нужного и заполняй этот байт (а лучше всю строку, ибо можно глюки ловить на ровном месте, если хитро с ней работать) нулями.
Например, если ты ожидаешь получить максимум 1024 байт, выдели буфер длиной 1025 байт.
PS. Под выражением "чужая память" я подразумевал память, которую система тебе не выделяла. Это совсем не означает, что ты залезешь в память соседней программы :)