从C中的字符串开头删除char的成本较低的方法是什么?

时间:2014-01-09 16:03:47

标签: c string dynamic-memory-allocation strdup

我必须创建一个非常便宜的算法(处理器和内存)来从C中的字符串(char数组)中删除第一个char

我目前正在使用:

char *newvalue = strdup(value+1);
free(value);
value = newvalue;

但我想知道是否有更便宜的方式来做到这一点。字符串value是动态分配的。

3 个答案:

答案 0 :(得分:5)

value+1char*,表示删除了第一个字符的字符串。这是获得这种字符串的较便宜的方法..

在释放内存时你必须要小心,以确保释放原始指针而不是移动指针。

答案 1 :(得分:3)

重用原始数组。可能或可能不会更快,取决于内存(de)分配和复制的相对速度。

int size = strlen(value);
if (size > 0) memmove(value, value+1, size);

答案 2 :(得分:1)

由于堆调用非常昂贵,显而易见的优化是避免它们。

如果你需要经常这样做,你可能会想出一些简单的包装器来围绕可以表达这一点的裸指针。

类似的东西:

typedef struct {
  const char *chars;
  size_t offset;
} mystring;

然后你需要设计一个API,通过添加偏移量将mystring *转换为字符指针:

const char * mystring_get(const mystring *ms)
{
  return ms->chars + ms->offset;
}

当然还有一个函数来创建删除第一个字符的后缀:

mystring mystring_tail(const mystring *ms)
{
  const mystring suffix = { ms->chars, ms->offset + 1};

  return suffix;
}

请注意mystring_tail()按值返回新的字符串结构,以避免堆分配。