我正在用C语言编写一款语言解释器,我的string
类型包含一个length
属性,如下所示:
struct String
{
char* characters;
size_t length;
};
因此,我必须在我的解释器中手动处理这种字符串,因为C语言没有内置支持。考虑到底层的C要求使用简单的空字符结尾的字符串,但似乎有很多不适用的情况:如果你使用"length"而不是寻找空字符,那么边界检查就内置了。
必须遍历整个字符串才能找到它的长度。
必须做一些额外的工作来处理空字符出现在空字符结尾字符串中间的情况。
空字符结尾的字符串对Unicode的支持较差。
非空字符结尾的字符串可以更好地进行字符串切片(注意:在我的语言中,字符串是不可变的)。显然第二个方法更慢(并且更容易出错:思考将错误检查添加到两个函数的begin和end参数中)。
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要使用它们!所以我的问题是:我是否忽略了空结尾的任何好处?