我正在用 C 编写语言解释器,我的string
类型包含一个length
属性,如下所示:
struct String
{
char* characters;
size_t length;
};
正因为如此,我不得不花很多时间在我的解释器中手动处理这种字符串,因为 C 不包含对它的内置支持。我考虑过切换到简单的以 null 结尾的字符串以符合底层 C,但似乎有很多理由不这样做:
如果您使用“长度”而不是查找空值,则内置边界检查。
您必须遍历整个字符串才能找到它的长度。
您必须做一些额外的事情来处理以空字符结尾的字符串中间的空字符。
以空字符结尾的字符串无法很好地处理 Unicode。
非空结尾的字符串可以实习更多,即“Hello, world”和“Hello”的字符可以存储在同一个地方,只是长度不同。这不能用空终止的字符串来完成。
字符串切片(注意:字符串在我的语言中是不可变的)。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 使用它们!
所以我的问题是:我缺少的空终止有什么好处吗?