Стандартная библиотека работы со строками
Работа № 3
Работа со строками символов
Цель работы
Изучить организацию строк символов в языке Си; ознакомиться со стандартной библиотекой работы со строками; научиться осуществлять ввод/вывод и обработку строк символов.
Теоретические сведения
Строковые литералы
Особым случаем массива является строковый литерал – последовательность любых символов, заключенных в парные двойные кавычки. В Си отсутствует специальный строковый тип. Вместо этого строковый литерал представляется как массив элементов типа char, в конце которого помещен символ '\0' (нуль-терминатор). Такой массив называют строкой в формате ASCIIZ или просто ASCIIZ-строкой. Как и с любым массивом символов, со строковым литералом связан указатель-константа на первый элемент массива.
Адрес первого символа строкового литерала используется по-разному, в зависимости от того, для чего используется литерал. Если строковый литерал применяется для инициализации массива типа char, адрес его первого символа становится синонимом имени массива. Например:
char str[] = "строка";
или
char str[7] = "строка";
или
char str[7] = {'с','т','р','о','к','а','\0'};
Если литерал используется для инициализации указателя типа char *, адрес первого символа литерала будет начальным значением указателя. Например:
char *str="строка";
Если литерал используется в выражении в тех местах, где разрешается применять указатель, компилятор подставляет в выражение вместо литерала адрес первого его символа. Например:
char *str;
str = "строка";
При выполнении операции присваивания, в ячейку памяти, отведенную для указателя str, пересылается не массив символов, а только указатель на его начало.
В зависимости от настроек Turbo C для каждого строкового литерала может быть создана своя ASCIIZ-строка, либо использована ссылка на уже имеющийся аналогичный литерал (например, если в программе четыре раза встречается строка символов "Введите целое число: "). По умолчанию используется первый вариант.
Стандартная библиотека работы со строками
Наиболее типичные операции над строковыми данными оформлены в виде функций стандартной библиотеки работы со строками, подключаемой к программе с помощью файла-заголовка string.h:
#include <string.h>
В качестве аргументов функций обычно выступают указатели на строки. Если результат работы функции сохраняется по соответствующему указателю, то для него должно быть предварительно зарезервировано место в памяти (в том числе и для нуль-терминатора, которым заканчивается строка).
Из набора функций библиотеки при выполнении данной лабораторной работы могут быть использованы следующие.
· strcpy(char* dst, char* src) – копирование строки, адресованной src, в область памяти, на которую указывает dst. Функция возвращает указатель на начало скопированной строки.
· stpcpy(char* dst, char* src) – выполняет то же, что и предыдущая функция, но возвращает указатель на конец результирующей строки.
· strncpy(char* dst, char* src, size_t n) – действие аналогично функции strcpy, но копируются только первые n символов строки src (или меньше, если длина строки меньше n). Тип size_t – целочисленный тип, используемый стандартными функциями Си для хранения индексов массивов.
· strdup(char* s) – выделяет память и копирует в нее содержимое строки s. Возвращает указатель на начало строки-копии или константу NULL, если выделение памяти завершилось неудачей.
· strlwr(char* s), strupr(char* s) – преобразует все латинские символы строки s соответственно к нижнему и к верхнему регистру.
· strrev(char* s) – меняет порядок следования символов строки на противоположный.
· strcat(char* dst, char* src) – присоединяет строку src в конец строки dst. В результате dst содержит в себе две строки (но только один нуль-терминатор).
· strncat(char* dst, char* src, size_t n) – аналогично предыдущей функции, но действие распространяется только на n первых символов строки src.
· strset(char* s, int ch) – заполняет все позиции строки s символом ch.
· strnset(char* s, int ch, size_t n) – то же для первых n символов строки s.
· strcmp(const char* s1, const char *s2) – сравнивает строки, заданные константными указателями s1 и s2, в лексикографическом порядке с учетом различия прописных и строчных букв. Возвращает нуль, если обе строки идентичны, значение меньше нуля, если строка s1 расположена в упорядоченном по алфавиту «словаре» раньше, чем s2, или значение больше нуля в противном случае.
· stricmp(const char* s1, const char *s2) – то же, но без учета разницы между прописными и строчными латинскими буквами.
· strncmp(const char* s1, const char *s2, size_t n), strnicmp(const char* s1, const char *s2, size_t n) – аналогичные действия для первых n символов строк.
· strchr(const char* s, int ch) – возвращает указатель на первое вхождение символа ch в строку s. Нуль-терминатор также участвует в поиске. Если поиск неудачен, возвращается NULL.
· strrchr(const char* s, int ch) – то же, но возвращается указатель на последний совпавший символ в строке.
· strlen(char* s) – возвращает длину строки в байтах без учета нуль-терминатора.
· strpbrk(const char* s1, const char *s2) – сканирует строку s1, сравнивая ее со всеми символами строки s2. При первом совпадении возвращает указатель на совпавший символ в строке s1, в противном случае возвращает NULL.
· strstr(const char* s1, const char *s2) – находит место первого вхождения строки s2 в строку s1 и возвращает указатель на соответствующую позицию в s1.
· strspn(const char* s1, const char *s2) – возвращает длину сегмента строки s1, состоящего только из символов, входящих в строку s2. Нуль-терминатор не участвует в сравнении. Если строка s1 начинается с символа, не совпадающего ни с одним из символов строки s2, возвращается 0.
· strсspn(const char* s1, const char *s2) – возвращает длину сегмента строки s1, состоящего только из символов, не входящих в строку s2. Длина отсчитывается от начала строки s1.
· strtok(char* s1, const char *s2) – выделяет лексему в строке s1. Под лексемой в данном случае понимается фрагмент строки s1, ограниченный любыми из символов, встречающихся в строке s2. Возвращается указатель на выделенную лексему или NULL.