Несмотря на мой комментарий к исходному вопросу, проблема заключается в том, что для такой функции необходим буфер для хранения результата, и неясно, должен ли он быть предоставлен вызывающей стороной или создан функцией (оставляя вопрос о том, как позже он уничтожается) или даже создается на месте путем изменения исходной строки. В разных ситуациях вам может потребоваться другое поведение, поэтому выкатывание собственного может быть полезным (и в любом случае тривиальным).
// Caller supplied destination
char* substr( const char* source, size_t start, size_t end, char* dest )
{
memmove( dest, &source[start], end - start ) ;
dest[end - start] = 0 ;
return dest ;
}
// Automatically instantiated destination (and a memory leak!)
char* substr( const char* source, size_t start, size_t end )
{
char* dest = malloc( end - start + 1) ;
memcpy( dest, &source[start], end - start ) ;
dest[end - start] = 0 ;
return dest ;
}
// Modify in-place (original string truncated)
char* substr( char* source, size_t start, size_t end )
{
source[end+1] = 0 ;
return &source[start] ;
}
Обратите внимание, что во всех вышеперечисленных действиях аргументы, такие как проверка границ и определение того, что start