一尘不染

为什么以null终止的字符串?或者:以零结尾的字符与字符+长度存储

algorithm

我正在用C语言编写语言解释器,并且我的string类型包含一个length属性,如下所示:

struct String
{
    char* characters;
    size_t length;
};

因此,由于C不包含对它的内置支持,因此我不得不在解释器中花费大量时间来手动处理这种字符串。我已经考虑过切换到简单的以null终止的字符串以符合基础C的要求,但是似乎有很多理由不这样做:

如果您使用“长度”而不是寻找空值,则边界检查是内置的。

您必须遍历整个字符串以找到其长度。

您必须做一些额外的工作才能处理以空字符结尾的字符串中间的空字符。

以Null结尾的字符串在处理Unicode方面效果不佳。

非空终止的字符串可以进行更多的实习,即,“ Hello,world”和“
Hello”的字符可以存储在同一位置,但长度不同。这不能使用以null终止的字符串。

字符串切片(注意:字符串在我的语言中是不可变的)。显然第二个比较慢(并且更容易出错:考虑对beginend都添加错误检查)。

struct String slice(struct String in, size_t begin, size_t end)
{
    struct String out;
    out.characters = in.characters + begin;
    out.length = end - begin;

    return out;
}

char* slice(char* in, size_t begin, size_t end)
{
    char* out = malloc(end - begin + 1);

    for(int i = 0; i < end - begin; i++)
        out[i] = in[i + begin];

    out[end - begin] = '\0';

    return out;
}

毕竟,我的想法不再是我是否应该使用以空值结尾的字符串:我正在考虑为什么C使用它们!

所以我的问题是:我缺少的零终止有什么好处吗?


阅读 254

收藏
2020-07-28

共1个答案

一尘不染

通常的解决方案是同时做这两种-保持长度并保持空终止符。不需要太多的工作,这意味着您随时可以将字符串传递给任何函数。

空终止的字符串通常会降低性能,原因很明显,发现长度所花费的时间取决于长度。从好的方面来说,它们是用C表示字符串的标准方法,因此,如果您想使用大多数C库,则别无选择,只能支持它们。

2020-07-28