Стандартная библиотека работы со строками

Работа № 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.