S21_string-

Форк
0

9 месяцев назад
9 месяцев назад
9 месяцев назад
год назад
10 месяцев назад
10 месяцев назад
9 месяцев назад
README.md

s21_string+

Реализация библиотеки string.h с дополнениями.

Contents

  1. Chapter I
    1.1. Introduction
  2. Chapter II
    2.1. Information
  3. Chapter III
    3.1. Part 1
    3.2. Part 2
    3.3. Part 3
    3.4. Part 4
    3.5. Part 5

Chapter I

Introduction

В данном проекте Вам предстоит разработать собственную реализацию библиотеки string.h на языке программирования Си с некоторыми дополнениями (с собственной реализацией функций sprintf и sscanf). Библиотека string.h является основной библиотекой языка Си по обработке строк. В рамках этого проекта предполагается отработка задач на работу со строковыми данными и закрепление структурного подхода.

Chapter II

Information

Язык программирования C содержит набор функций, реализующих операции со строками (символьными строками и строками байтов) в своей стандартной библиотеке. В ней поддерживаются различные операции, такие как копирование, конкатенация, маркировка и поиск. Для символьных строк в стандартной библиотеке существует правило о том, что строки должны заканчиваться терминирующим нуль-символом: строка из n символов представляется в виде массива из n + 1 элементов, последний из которых является символом "NULL".
Единственная поддержка строк собственно в языке программирования С заключается в том, что компилятор преобразует строковые константы в кавычках в строки, заканчивающиеся нулем.

string.h Типы

ПеременнаяОписание
1size_tЦелочисленный тип без знака, являющийся результатом ключевого слова sizeof.

string.h Макросы

МакросОписание
1NULLМакрос, являющийся значением константы нулевого указателя.

string.h Функции

ФункцияОписание
1void *memchr(const void *str, int c, size_t n)Выполняет поиск первого вхождения символа c (беззнаковый тип) в первых n байтах строки, на которую указывает аргумент str.
2int memcmp(const void *str1, const void *str2, size_t n)Сравнивает первые n байтов str1 и str2.
3void *memcpy(void *dest, const void *src, size_t n)Копирует n символов из src в dest.
4void *memset(void *str, int c, size_t n)Копирует символ c (беззнаковый тип) в первые n символов строки, на которую указывает аргумент str.
5char *strncat(char *dest, const char *src, size_t n)Добавляет строку, на которую указывает src, в конец строки, на которую указывает dest, длиной до n символов.
6char *strchr(const char *str, int c)Выполняет поиск первого вхождения символа c (беззнаковый тип) в строке, на которую указывает аргумент str.
7int strncmp(const char *str1, const char *str2, size_t n)Сравнивает не более первых n байтов str1 и str2.
8char *strncpy(char *dest, const char *src, size_t n)Копирует до n символов из строки, на которую указывает src, в dest.
9size_t strcspn(const char *str1, const char *str2)Вычисляет длину начального сегмента str1, который полностью состоит из символов, не входящих в str2.
10char *strerror(int errnum)Выполняет поиск во внутреннем массиве номера ошибки errnum и возвращает указатель на строку с сообщением об ошибке. Нужно объявить макросы, содержащие массивы сообщений об ошибке для операционных систем mac и linux. Описания ошибок есть в оригинальной библиотеке. Проверка текущей ОС осуществляется с помощью директив.
11size_t strlen(const char *str)Вычисляет длину строки str, не включая завершающий нулевой символ.
12char *strpbrk(const char *str1, const char *str2)Находит первый символ в строке str1, который соответствует любому символу, указанному в str2.
13char *strrchr(const char *str, int c)Выполняет поиск последнего вхождения символа c (беззнаковый тип) в строке, на которую указывает аргумент str.
14char *strstr(const char *haystack, const char *needle)Находит первое вхождение всей строки needle (не включая завершающий нулевой символ), которая появляется в строке haystack.
15char *strtok(char *str, const char *delim)Разбивает строку str на ряд токенов, разделенных delim.

sprintf and sscanf

  • int sscanf(const char *str, const char *format, ...) - считывает форматированный ввод из строки.
  • int sprintf(char *str, const char *format, ...) - отправляет форматированный вывод в строку, на которую указывает str.

где:

  • str − Это С-строка, которую функция обрабатывает в качестве источника для извлечения данных;
  • format − это С-строка, содержащая один или несколько следующих элементов: пробельный символ, непробельный символ и спецификаторы формата. Спецификатор формата для печатающих функций следует прототипу: %[флаги][ширина][.точность][длина]спецификатор. Спецификатор формата для сканирующих функций следует прототипу: %[*][ширина][длина]спецификатор.

sprintf and sscanf Спецификаторы

СпецификаторРезультат sprintfРезультат sscanf
1cСимволСимвол
2dЗнаковое десятичное целое числоЗнаковое десятичное целое число
3iЗнаковое десятичное целое числоЗнаковое целое число (может быть десятичным, восьмеричным или шестнадцатеричным)
4eНаучная нотация (мантисса/экспонента) с использованием символа e (вывод чисел должен совпадать с точностью до e-6)Десятичное число с плавающей точкой или научная нотация (мантисса/экспонента)
5EНаучная нотация (мантисса/экспонента) с использованием символа ЕДесятичное число с плавающей точкой или научная нотация (мантисса/экспонента)
6fДесятичное число с плавающей точкойДесятичное число с плавающей точкой или научная нотация (мантисса/экспонента)
7gИспользует кратчайший из представлений десятичного числаДесятичное число с плавающей точкой или научная нотация (мантисса/экспонента)
8GИспользует кратчайший из представлений десятичного числаДесятичное число с плавающей точкой или научная нотация (мантисса/экспонента)
9oБеззнаковое восьмеричное числоБеззнаковое восьмеричное число
10sСтрока символовСтрока символов
11uБеззнаковое десятичное целое числоБеззнаковое десятичное целое число
12xБеззнаковое шестнадцатеричное целое числоБеззнаковое шестнадцатеричное целое число (любые буквы)
13XБеззнаковое шестнадцатеричное целое число (заглавные буквы)Беззнаковое шестнадцатеричное целое число (любые буквы)
14pАдрес указателяАдрес указателя
15nКоличество символов, напечатанных до появления %nКоличество символов, считанных до появления %n
16%Символ %Символ %

sprintf Флаги

ФлагОписание
1-Выравнивание по левому краю в пределах заданной ширины поля. Выравнивание по правому краю используется по умолчанию (см. подспецификатор ширины).
2+Заставляет явно указывать знак плюс или минус (+ или -) даже для положительных чисел. По умолчанию только отрицательным числам предшествует знак "-".
3(пробел)Если знак не будет выведен, перед значением вставляется пробел.
4#При использовании со спецификаторами o, x или X перед числом вставляется 0, 0x или 0X соответственно (для значений, отличных от нуля). При использовании с e, E и f "заставляет" записанный вывод содержать десятичную точку, даже если за ней не последует никаких цифр. По умолчанию, если не следует никаких цифр, десятичная точка не записывается. При использовании с g или G результат такой же, как и с e или E, но конечные нули не удаляются.
50Заполняет число слева нулями (0) вместо пробелов, где указан спецификатор ширины (см. подспецификатор ширины).

sprintf and sscanf Ширина

ШиринаОписание
1(число)Минимальное количество печатаемых символов. Если выводимое значение короче этого числа, результат дополняется пробелами. Значение не усекается, даже если результат больше.
2*В sprintf знак * значит, что ширина указывается не в строке формата, а в качестве дополнительного аргумента целочисленного значения, предшествующего аргументу, который необходимо отформатировать. В sscanf знак *, помещенный после % и перед спецификатором формата, считывает данные указанного типа, но подавляет их присваивание.

sprintf Точность

.точностьОписание
1.числоДля целочисленных спецификаторов (d, i, o, u, x, X) − точность определяет минимальное количество записываемых цифр. Если записываемое значение короче этого числа, результат дополняется ведущими нулями. Значение не усекается, даже если результат длиннее. Точность 0 означает, что для значения 0 не записывается ни одного символа. Для спецификаторов e, E и f − это количество цифр, которые должны быть напечатаны после десятичной точки. Для спецификаторов g и G − это максимальное количество значащих цифр, которые должны быть напечатаны. Для s − это максимальное количество печатаемых символов. По умолчанию все символы печатаются до тех пор, пока не встретится терминирующий нуль. Для типа с − никак не влияет. Если точность не указана для спецификаторов e, E, f, g и G, то по умолчанию ее значение равно 6. Если точность не указана для остальных спецификаторов, то по умолчанию ее значение равно 1. Если число не указано (нет явного значения точности), то по умолчанию - 0.
2.*Точность указывается не в строке формата, а в качестве дополнительного аргумента целочисленного значения, предшествующего аргументу, который должен быть отформатирован.

sprintf and sscanf Длина

ДлинаОписание
1hАргумент интерпретируется как короткое int или короткое int без знака (применяется только к целочисленным спецификаторам: i, d, o, u, x и X).
2lАргумент интерпретируется как длинное int или длинное int без знака для целочисленных спецификаторов (i, d, o, u, x и X) и как широкий символ или строка широких символов для спецификаторов c и s.
3LАргумент интерпретируется как длинный double (применяется только к спецификаторам с плавающей точкой − e, E, f, g и G).

Специальные функции обработки строк (вдохновленные классом String в языке C#)

ФункцияОписание
1void *to_upper(const char *str)Возвращает копию строки (str), преобразованной в верхний регистр. В случае какой-либо ошибки следует вернуть значение NULL
2void *to_lower(const char *str)Возвращает копию строки (str), преобразованной в нижний регистр. В случае какой-либо ошибки следует вернуть значение NULL
3void *insert(const char *src, const char *str, size_t start_index)Возвращает новую строку, в которой указанная строка (str) вставлена в указанную позицию (start_index) в данной строке (src). В случае какой-либо ошибки следует вернуть значение NULL
4void *trim(const char *src, const char *trim_chars)Возвращает новую строку, в которой удаляются все начальные и конечные вхождения набора заданных символов (trim_chars) из данной строки (src). В случае какой-либо ошибки следует вернуть значение NULL

Chapter III

Part 1. Реализация функций библиотеки string.h

Необходимо реализовать описанные выше функции библиотеки string.h:

  • Библиотека должна быть разработана на языке Си стандарта C11 с использованием компилятора gcc
  • Код библиотеки, включая заголовочные файлы, мейкфайлы и саму библиотеку, должен находиться в папке src в ветке develop
  • Не использовать устаревшие и выведенные из употребления конструкции языка и библиотечные функции. Обращать внимания на пометки 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.

Part 2. Частичная реализация функции sprintf

Необходимо реализовать функцию sprintf из библиотеки stdio.h:

  • Функция должна быть размещена в библиотеке s21_string.h.
  • На реализацию функции накладываются все требования, изложенные в первой части.
  • Должно поддерживаться частичное форматирование:
    • Спецификаторы: c, d, f, s, u, %
    • Флаги: -, +, (пробел)
    • Ширина: (число)
    • Точность: .(число)
    • Длина: h, l

Part 3. Дополнительно. Реализация некоторых модификаторов формата функции sprintf

Необязательное задание на дополнительные баллы. Необходимо реализовать некоторые модификаторы формата функции sprintf из библиотеки stdio.h:

  • Функция должна быть размещена в библиотеке s21_string.h.
  • На реализацию функции накладываются все требования, изложенные в первой части.
  • Должны поддерживаться следующие дополнительные модификаторы формата:
    • Спецификаторы: g, G, e, E, x, X, o, p
    • Флаги: #, 0
    • Ширина: *
    • Точность: .*
    • Длина: L

Part 4. Дополнительно. Реализация функции sscanf

Необязательное задание на дополнительные баллы. Необходимо реализовать функцию sscanf из библиотеки stdio.h:

  • Функция должна быть размещена в библиотеке s21_string.h.
  • На реализацию функции накладываются все требования, изложенные в первой части.
  • Должно поддерживаться полное форматирование (с учетом флагов, ширины, точности, модификаторов и типов преобразования).

Part 5. Дополнительно. Реализация специальных функций обработки строк

Необязательное задание на дополнительные баллы. Необходимо реализовать некоторые функции обработки строк из класса String (описанные здесь):

  • Функции должны быть размещены в библиотеке s21_string.h.
  • На реализацию функций накладываются все требования, изложенные в первой части, исключая требование о сравнении вашей реализации со стандартом.

Описание

Реализация библиотеки string.h с дополнениями.

Языки

C

  • Makefile
Сообщить о нарушении

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.