在C中实现substr是否有一种优雅的行业标准方式?

时间:2010-05-21 08:00:34

标签: c string substring

在C中实现substr()是否有优雅的跨平台行业标准方式?

或是每个开发人员重新发明轮子的情况?

编辑:添加'跨平台'。

2 个答案:

答案 0 :(得分:5)

我对原始问题的评论尽管如此,问题是这样的函数需要一个缓冲区来存储结果,并且不清楚这是应该由调用者提供还是由函数实例化(留下问题如何它后来被破坏了),甚至通过修改原始字符串来创建。在不同情况下,您可能需要不同的行为,因此滚动您自己的行为可能是有益的(在任何情况下都是微不足道的。)

// 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] ;
}

注意以上所有内容,参数的有效性,例如边界检查和确定开始< end留给调用者,在这方面他们反映了标准字符串库的哲学。在大多数情况下,我更喜欢第一个具有最大效用并且更符合标准库的设计。 memmove()用于memcpy(),以便源和目标可能是同一个位置,如果你不需要,使用memcpy()可能更有效。

答案 1 :(得分:3)

就像那样:

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

编辑:添加了偏移&gt; 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;
    }
}