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