Я пишу переводчик языка на C, а мой тип string
содержит атрибут length
, например:
struct String
{
char* characters;
size_t length;
};
Из-за этого мне приходится тратить много времени в моем интерпретаторе на ручную обработку этого типа строки, поскольку C не имеет встроенной поддержки для нее. Я подумал о переходе на простые строки с нулевым символом в конце только для соответствия базовому 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 использует их!
Итак, мой вопрос: есть ли какие-то преимущества от нулевого завершения, которое я пропускаю?