Я пишу интерпретатор языка в 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 использует их!
Итак, мой вопрос: есть ли какие-либо преимущества для null-term, которые мне не хватает?
Поскольку malloc() настолько дорог в C, я предлагаю использовать эту структуру: struct String {size_t length; char [1] символов; } Просто выделите строки strlen (s) + 1 + sizeof (size_t) или strlen (s) + sizeof (String) и скопируйте строку в адрес и символы. –
Это просто. В этом польза. –