A group project. Implementation of the library string.h in the C programming language. Using the check.h and lcov libraries to write unit tests.
C
The library string.h in the C programming language
Реализация библиотеки string.h с дополнениями.
В данном проекте тебе предстоит разработать собственную реализацию библиотеки string.h на языке программирования С с некоторыми дополнениями (с собственной реализацией функций sprintf и sscanf).
Библиотека string.h является основной библиотекой языка С по обработке строк.
Язык программирования C содержит набор функций, реализующих операции со строками (символьными строками и строками байтов) в своей стандартной библиотеке.
В ней поддерживаются такие операции, как: копирование, конкатенация, маркировка и поиск. Для символьных строк в стандартной библиотеке существует правило, что строки должны заканчиваться терминирующим нуль-символом:
строка из n символов представляется в виде массива из n + 1 элементов, последний из которых является символом «NULL».
Единственная поддержка строк, собственно, в языке программирования С заключается в том, что компилятор преобразует закавыченные строковые константы в строки, заканчивающиеся нулем.
Сторонние используемые инструменты.
В проекте используется библиотека check.h для создания unit-тестов.
Check - это платформа модульного тестирования для C. Она имеет простой интерфейс для определения модульных тестов, что практически не затрудняет работу разработчика.
Тесты выполняются в отдельном адресном пространстве, поэтому Check может выявлять как ошибки утверждения, так и ошибки кода, которые вызывают ошибки сегментации или другие сигналы.
Результаты модульных тестов могут быть использованы в редакторах исходного кода и IDE.
В проекте используется инструмент для анализа данных о покрыти кода unit-тестами, сгенерированных компилятором GCC: lcov.
Типы
№
Переменная
Описание
1
size_t
Целочисленный тип без знака, являющийся результатом ключевого слова sizeof.
Вычисляет длину начального сегмента 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.
Находит первое вхождение всей строки needle (не включая завершающий нулевой символ), которая появляется в строке haystack.
15
char *strtok(char *str, const char *delim)
Разбивает строку str на ряд токенов, разделенных delim.
sprintf и sscanf
int sscanf(const char *str, const char *format, ...) — считывает форматированный ввод из строки.
int sprintf(char *str, const char *format, ...) — отправляет форматированный вывод в строку, на которую указывает str.
где:
str — это С-строка, которую функция обрабатывает в качестве источника для извлечения данных;
format — это С-строка, содержащая один или несколько следующих элементов: пробельный символ, непробельный символ и спецификаторы формата. Спецификатор формата для печатающих функций следует прототипу: %[флаги][ширина][.точность][длина]спецификатор. Спецификатор формата для сканирующих функций следует прототипу: %[*][ширина][длина]спецификатор.
sprintf и sscanf Спецификаторы
№
Спецификатор
Результат sprintf
Результат sscanf
1
c
Символ
Символ
2
d
Знаковое десятичное целое число
Знаковое десятичное целое число
3
i
Знаковое десятичное целое число
Знаковое целое число (может быть десятичным, восьмеричным или шестнадцатеричным)
4
e
Научная нотация (мантисса/экспонента) с использованием символа e (вывод чисел должен совпадать с точностью до e-6)
Десятичное число с плавающей точкой или научная нотация (мантисса/экспонента)
5
E
Научная нотация (мантисса/экспонента) с использованием символа Е
Десятичное число с плавающей точкой или научная нотация (мантисса/экспонента)
6
f
Десятичное число с плавающей точкой
Десятичное число с плавающей точкой или научная нотация (мантисса/экспонента)
7
g
Использует кратчайший из представлений десятичного числа
Десятичное число с плавающей точкой или научная нотация (мантисса/экспонента)
8
G
Использует кратчайший из представлений десятичного числа
Десятичное число с плавающей точкой или научная нотация (мантисса/экспонента)
9
o
Беззнаковое восьмеричное число
Беззнаковое восьмеричное число
10
s
Строка символов
Строка символов
11
u
Беззнаковое десятичное целое число
Беззнаковое десятичное целое число
12
x
Беззнаковое шестнадцатеричное целое число
Беззнаковое шестнадцатеричное целое число (любые буквы)
13
X
Беззнаковое шестнадцатеричное целое число (заглавные буквы)
Беззнаковое шестнадцатеричное целое число (любые буквы)
14
p
Адрес указателя
Адрес указателя
15
n
Количество символов, напечатанных до появления %n
Количество символов, считаных до появления %n
16
%
Символ %
Символ %
sprintf Флаги
№
Флаг
Описание
1
-
Выравнивание по левому краю в пределах заданной ширины поля. Выравнивание по правому краю используется по умолчанию (см. подспецификатор ширины).
2
+
Заставляет явно указывать знак плюс или минус (+ или -) даже для положительных чисел. По умолчанию только отрицательным числам предшествует знак «-».
3
(пробел)
Если знак не будет выведен, перед значением вставляется пробел.
4
#
При использовании со спецификаторами o, x или X перед числом вставляется 0, 0x или 0X соответственно (для значений, отличных от нуля). При использовании с e, E и f «заставляет» записанный вывод содержать десятичную точку, даже если за ней не последует никаких цифр. По умолчанию, если не следует никаких цифр, десятичная точка не записывается. При использовании с g или G результат такой же, как и с e или E, но конечные нули не удаляются.
5
0
Заполняет число слева нулями (0) вместо пробелов, где указан спецификатор ширины (см. подспецификатор ширины).
sprintf и 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 и sscanf Длина
№
Длина
Описание
1
h
Аргумент интерпретируется как короткое int или короткое int без знака (применяется только к целочисленным спецификаторам: i, d, o, u, x и X).
2
l
Аргумент интерпретируется как длинное int или длинное int без знака для целочисленных спецификаторов (i, d, o, u, x и X) и как широкий символ или строка широких символов для спецификаторов c и s.
3
L
Аргумент интерпретируется как длинный double (применяется только к спецификаторам с плавающей точкой — e, E, f, g и G).
Специальные функции обработки строк (вдохновленные классом String в языке C#)
№
Функция
Описание
1
void *to_upper(const char *str)
Возвращает копию строки (str), преобразованной в верхний регистр. В случае какой-либо ошибки следует вернуть значение NULL.
2
void *to_lower(const char *str)
Возвращает копию строки (str), преобразованной в нижний регистр. В случае какой-либо ошибки следует вернуть значение NULL.
Возвращает новую строку, в которой указанная строка (str) вставлена в указанную позицию (start_index) в данной строке (src). В случае какой-либо ошибки следует вернуть значение NULL.
Возвращает новую строку, в которой удаляются все начальные и конечные вхождения набора заданных символов (trim_chars) из данной строки (src). В случае какой-либо ошибки следует вернуть значение NULL.