在C中实现substr()
是否有优雅的跨平台行业标准方式?
或是每个开发人员重新发明轮子的情况?
编辑:添加'跨平台'。
答案 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;
}
}