0

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

我目前正在使用:

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

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

4

3 回答 3

5

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

释放内存时必须小心,但要确保释放原始指针而不是移位的指针。

于 2014-01-09T16:06:40.080 回答
3

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

int size = strlen(value);
if (size > 0) memmove(value, value+1, size);
于 2014-01-09T16:09:36.500 回答
1

由于堆调用将非常昂贵,因此明显的优化是避免它们。

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

就像是:

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

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

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

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

于 2014-01-09T16:12:30.557 回答