Существует ли элегантный, стандартный для отрасли способ реализации substr в C? - PullRequest
2 голосов
/ 21 мая 2010

Существует ли элегантный, кроссплатформенный, стандартный отраслевой способ реализации substr() в C?

или каждый разработчик заново изобретает колесо?

РЕДАКТИРОВАТЬ: Добавлено «кроссплатформенный».

Ответы [ 2 ]

5 голосов
/ 21 мая 2010

Несмотря на мой комментарий к исходному вопросу, проблема заключается в том, что для такой функции необходим буфер для хранения результата, и неясно, должен ли он быть предоставлен вызывающей стороной или создан функцией (оставляя вопрос о том, как позже он уничтожается) или даже создается на месте путем изменения исходной строки. В разных ситуациях вам может потребоваться другое поведение, поэтому выкатывание собственного может быть полезным (и в любом случае тривиальным).

// 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

3 голосов
/ 21 мая 2010

вот так:

#include <string.h>
char* substr(int offset, int len, const char* input)
{
    /* this one assumes that strlen(input) >= offset */
    return strndup(input+offset, len);
}

EDIT: добавлена ​​обработка смещения> strlen и удалено использование strndup

#include <string.h>
#include <stdlib.h>

char* substr(size_t offset, size_t len, const char* input)
{
    const size_t inputLength = strlen(input);
    if(offset <= inputLength)
    {
        size_t resultLength = inputLength-offset;
        char* result = NULL;
        if (len < resultLength)
        {
            resultLength = len;
        }
        result = malloc(resultLength+1);
        if(NULL != result)
        {
            strncpy(result, input+offset, resultLength);
            result[resultLength] = 0;
        }
        return result;
    }
    else
    {
        /* Offset is larger than the string length */
        return NULL;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...