В данном проекте разработанна собственная реализация библиотеки string.h на языке программирования Си с некоторыми дополнениями (с собственной реализацией функций sprintf). Библиотека string.h является основной библиотекой языка Си по обработке строк. В рамках этого проекта предполагается отработка задач на работу со строковыми данными и закрепление структурного подхода.
№ | Функция | Описание |
---|---|---|
1 | void *memchr(const void *str, int c, size_t n) |
Выполняет поиск первого вхождения символа c (беззнаковый тип) в первых n байтах строки, на которую указывает аргумент str. |
2 | int memcmp(const void *str1, const void *str2, size_t n) |
Сравнивает первые n байтов str1 и str2. |
3 | void *memcpy(void *dest, const void *src, size_t n) |
Копирует n символов из src в dest. |
4 | void *memset(void *str, int c, size_t n) |
Копирует символ c (беззнаковый тип) в первые n символов строки, на которую указывает аргумент str. |
5 | char *strncat(char *dest, const char *src, size_t n) |
Добавляет строку, на которую указывает src, в конец строки, на которую указывает dest, длиной до n символов. |
6 | char *strchr(const char *str, int c) |
Выполняет поиск первого вхождения символа c (беззнаковый тип) в строке, на которую указывает аргумент str. |
7 | int strncmp(const char *str1, const char *str2, size_t n) |
Сравнивает не более первых n байтов str1 и str2. |
8 | char *strncpy(char *dest, const char *src, size_t n) |
Копирует до n символов из строки, на которую указывает src, в dest. |
9 | size_t strcspn(const char *str1, const char *str2) |
Вычисляет длину начального сегмента str1, который полностью состоит из символов, не входящих в str2. |
10 | char *strerror(int errnum) |
Выполняет поиск во внутреннем массиве номера ошибки errnum и возвращает указатель на строку с сообщением об ошибке. Нужно объявить макросы, содержащие массивы сообщений об ошибке для операционных систем mac и linux. Описания ошибок есть в оригинальной библиотеке. Проверка текущей ОС осуществляется с помощью директив. |
11 | size_t strlen(const char *str) |
Вычисляет длину строки str, не включая завершающий нулевой символ. |
12 | char *strpbrk(const char *str1, const char *str2) |
Находит первый символ в строке str1, который соответствует любому символу, указанному в str2. |
13 | char *strrchr(const char *str, int c) |
Выполняет поиск последнего вхождения символа c (беззнаковый тип) в строке, на которую указывает аргумент str. |
14 | char *strstr(const char *haystack, const char *needle) |
Находит первое вхождение всей строки needle (не включая завершающий нулевой символ), которая появляется в строке haystack. |
15 | char *strtok(char *str, const char *delim) |
Разбивает строку str на ряд токенов, разделенных delim. |
№ | Спецификатор | Результат sprintf |
---|---|---|
1 | с | Символ |
2 | d | Знаковое десятичное целое число |
3 | o | Беззнаковое восьмеричное число |
4 | f | Десятичное число с плавающей точкой |
5 | s | Строка символов |
6 | u | Беззнаковое десятичное целое число |
7 | X | Беззнаковое шестнадцатеричное целое число (заглавные буквы) |
8 | x | Беззнаковое шестнадцатеричное целое число |
9 | n | Количество символов, напечатанных до появления %n |
10 | % | Символ % |
№ | Флаг | Описание |
---|---|---|
1 | - | Выравнивание по левому краю в пределах заданной ширины поля. Выравнивание по правому краю используется по умолчанию (см. подспецификатор ширины) |
2 | + | Заставляет явно указывать знак плюс или минус (+ или -) даже для положительных чисел. По умолчанию только отрицательным числам предшествует знак "-" |
3 | (пробел) | Если знак не будет выведен, перед значением вставляется пробел |
№ | Длина | Описание |
---|---|---|
1 | h | Аргумент интерпретируется как короткое int или короткое int без знака (применяется только к целочисленным спецификаторам: i, d, o, u, x и X) |
2 | I | Аргумент интерпретируется как длинное int или длинное int без знака для целочисленных спецификаторов (i, d, o, u, x и X) и как широкий символ или строка широких символов для спецификаторов c и s. |
№ | Функция | Описание |
---|---|---|
1 | void *to_upper(const char *str) |
Возвращает копию строки (str), преобразованной в верхний регистр. В случае какой-либо ошибки следует вернуть значение NULL |
2 | void *to_lower(const char *str) |
Возвращает копию строки (str), преобразованной в нижний регистр. В случае какой-либо ошибки следует вернуть значение NULL |
3 | void *insert(const char *src, const char *str, size_t start_index) |
Возвращает новую строку, в которой указанная строка (str) вставлена в указанную позицию (start_index) в данной строке (src). В случае какой-либо ошибки следует вернуть значение NULL |
4 | void *trim(const char *src, const char *trim_chars) |
Возвращает новую строку, в которой удаляются все начальные и конечные вхождения набора заданных символов (trim_chars) из данной строки (src). В случае какой-либо ошибки следует вернуть значение NULL |
- Библиотека должна быть разработана на языке Си стандарта C11 с использованием компилятора gcc
- Не использовать устаревшие и выведенные из употребления конструкции языка и библиотечные функции. Обращать внимания на пометки legacy и obsolete в официальной документации по языку и используемым библиотекам. Ориентироваться на стандарт POSIX.1-2017
- При написании кода необходимо придерживаться Google Style
- Оформить решение как статическую библиотеку (с заголовочным файлом s21_string.h)
- Библиотека должна быть разработана в соответствии с принципами структурного программирования, должно быть исключено дублирование в коде
- Подготовить полное покрытие unit-тестами функций библиотеки c помощью библиотеки Check
- Unit-тесты должны проверять результаты работы вашей реализации путём ее сравнения с реализацией стандартной библиотеки string.h
- Unit-тесты должны покрывать не менее 80% каждой функции
- Предусмотреть Makefile для сборки библиотеки и тестов (с целями all, clean, test, s21_string.a, gcov_report)
- В цели gcov_report должен формироваться отчёт gcov в виде html страницы. Для этого unit-тесты должны запускаться с флагами gcov
- Перед каждой функцией использовать префикс s21_
- Запрещено копирование реализации и использование стандартной библиотеки string.h и других библиотек по обработке строк везде, кроме unit-тестов
- Запрещено использование системных списков ошибок, включая списки, непрописанные в стандартах POSIX (sys_nerr, sys_errlist). Вместо этого необходимо реализовать - свои платформозависимые списки ошибок, как это было упомянуто в описании функции strerror
- Необходимо соблюсти логику работы стандартной библиотеки string.h (в части проверок, работы с памятью и поведения в нештатных ситуациях - здесь помогут тесты)
- Функции должны работать с z-строками из однобайтовых символов в кодировке ASCII.