Загрузка данных


#include <cstddef>  // for size_t

class RangeError {
};

size_t CountValues(const char * data, size_t size);
K. Length-value-кодирование ПИ С++ 23
Не решена
Ограничение времени	1 секунда
Ограничение памяти	64 Мб
Ввод	стандартный ввод или input.txt
Вывод	стандартный вывод или output.txt
Length-value-кодирование (https://en.wikipedia.org/wiki/Type-length-value) - это простейший способ сериализации бинарных данных.

Пусть у нас есть набор каких-то строк (точнее, последовательностей байтов), и требуется сериализовать эти строки (записать непрерывным куском на диск или в память). Пусть в этих "строках" могут встречаться управляющие символы (например, символы с кодами 0, 10, 13). Тогда наивная запись таких строк через разделитель (например, \n) невозможна, так как этот разделитель может сам встречаться внутри строки.

В таких случаях обычно используют length-value формат: сначала записывают размер строки в байтах, а потом - саму строку.

Вам нужно написать функцию CountValues, которая получает на вход блок байтов (через указатель на начало и размер). Предполагается, что в этих байтах последовательно записаны какие-то строки с помощью length-value-кодирования. Функция должна вернуть количество записанных строк. Если блок байтов неожиданно заканчивается, а очередное значение из него не прочитано до конца, то требуется сгенерировать исключение типа RangeError.

Заготовка для функции есть здесь. Код доступен в общем архиве условий задач справа сверху.

Считайте, что длины строк записываются типом size_t.

Примечания
Пример: пусть у нас есть 2 строки со значениями "hello" и "world!". Закодируем их с помощью length-value-кодирования. Пусть наша платформа 64-битная, и тип size_t имеет размер 8 байт. Пусть мы имеем дело с архитектурой little-endian.

Тогда на вход функции CountValues поступит блок памяти из (8 + 5) + (8 + 6) = 27 байтов. Пример hex dump доступен в общем архиве условий задач справа сверху.

Функция в этом случае должна вернуть 2.

Ответ
Язык
(make) Clang 18.1.8