Все лабы по инфе за 2ой сем на С++ (string)

Посмотреть архив целиком

ОБРАБОТКА СИМВОЛЬНЫХ СТРОК



Символьная строка - основная структура данных в прикладных программах обработки текстовой информации. В терминах языка программирования C под строкой символов понимается любая последовательность символов, которую завершает нулевой код '\0'. В прикладной программе символьная строка может быть задана как строковая константа или как одномерный массив символов. Строковая константа определяется как набор символов, который заключен в двойные кавычки и неявно содержит завершающий символ с нулевым кодом. Следующий пример иллюстрируют два способа определения символьной строки "Unix" в форме строковой константы.


#define OS "Unix" /* Макроопределение строковой константы */

char* os = "Unix"; /* Указатель строковой константы */


Если символьная строка задается в форме одномерного массива, то все его элементы должны иметь тип char или (unsigned char), а последний символ должен иметь нулевой код. Способ формирования строки символов в массиве определяет выбор класса памяти для хранения его содержимого. Формирование строки символов в символьном массиве любого класса памяти обеспечивает явное присваивание желаемых кодов его элементам. Следующий блок исходного кода образует символьную строку "www" в массиве класса auto из четырех элементов.


{

char web[4];

web[0] = web[1] = web[2] = 'w';

web[3] = '\0';

}


Во внешнем или статическом массиве требуемая строка символов может быть получена путем инициализации его байтов содержимым строковой константы непосредственно при определении массива. Например, следующая декларация заставит компилятор выделить четыре байта для размещения статического массива и заполнить их кодами символов инициализирующей строки.


static char wm[] = "kde";

Аналогичный результат будет получен, если использовать менее компактную универсальную схему инициализации внешних и статических массивов любых типов как показано в следующем примере:


static char wm[] = { 'k', 'd', 'e', '\0' };


В обоих случаях нет необходимости явно задавать размер массива, потому что его автоматически определяет число инициализирующих символов. Если размер символьного массива указан явно и его значение больше требуемой длины строки, то лишние хвостовые элементы будет заполнять нулевой код.


При любом способе формирования доступ к символьной строке обеспечивает указатель типа (char *) или (unsigned char *), который содержит адрес начального символа строки. Такой принцип адресации позволяет передавать строки символов для необходимой функциональной обработки. Основными операциями функциональной обработки строк символов являются: измерение длины, копирование, конкатенация, сравнение, поиск и лексический разбор.


Система программирования C предоставляет обширный набор стандартных функций, которые реализуют перечисленные операции обработки символьных строк. Имена этих функций начинаются с префикса str, а их объектный код сосредоточен в стандартной библиотеке объектных модулей. Их программный интерфейс обеспечивает заголовочный файл <string.h>, где декларированы типы аргументов и кодов возврата всех функций обработки строк символов. Краткое описание принципа действия и применения этих функций, где они группируются по характеру выполняемых операций, приведено ниже.


Измерительная операция применяется, когда нужно определить длину строки или ее фрагмента. Длина строки вычисляется в байтах и равна числу ее символов до завершающего нулевого кода '\0'. Для измерения длины строки обычно используется функция strlen, спецификация формата вызова которой имеет вид:


unsigned strlen(const char* str);


Обращение к функции strlen возвращает длину символьной строки, которая адресована значением str. Например, вызов strlen("Linux") возвращает значение 5. Практическое использование функции strlen поясняет исходный код прикладной процедуры strcut, которая обрезает строку, адресуемую указателем longstr, если ее длина больше значения параметра limit.


/* Ограничение длинной строки */


void strcut(char* longstr, unsigned limit) {

if(strlen(longstr) > limit)

*(longstr + limit) = '\0';

} /* strcut */


Менее известны измерительные функции strspn и strcspn. Они вычисляют длину начального фрагмента строки, который, соответственно, составляет и исключает ограниченный набор символов. Спецификации формата их вызова имеют вид:


unsigned strspn (const char* str, const char* delimit);

unsigned strcspn(const char* str, const char* delimit);


Обе функции вычисляют максимальную длину начального фрагмента исходной строки, адресуемой указателем str, с учетом содержимого ограничительной строки, которую адресует указатель delimit. При этом функция strspn выявляет начальный фрагмент исходной строки, который состоит только из символов ограничительной строки. Функция strcspn, наоборот, определяет начальный фрагмент исходной строки, который не содержит символов из ограничительной строки. Обе функции передают результат вычислений через код возврата. Например, вызов функции strspn("happy", "path") возвратит значение 4, а обращение к функции strcspn при тех же аргументах вернет значение 0.


Действие функций strspn и strcspn можно рассматривать как поиск индекса позиции первого символа исходной строки, который, соответственно, не принадлежит или, наоборот, принадлежит кодовому набору ограничительной строки. В такой трактовке данные функции могут быть полезны, если нужно выделить информативную часть заданной строки. Например, исходный код прикладной функции deblank демонстрирует как обеспечить пропуск всех начальных пробелов и табуляций, используя функцию strspn:


/* Пропуск начальных пробелов и табуляций */


char* deblank(char* str) {

return(str + strspn(str, " \t"));

} /* deblank */


Для модификации содержимого символьных строк в прикладных программах наиболее часто применяется операция копирования. Полное или частичное копирование заданной строки символов обеспечивают функции strcpy и strncpy. Спецификации формата их вызова имеют вид:


char* strcpy (char* dest, const char* src);

char* strncpy(char* dest, const char* src, unsigned num);


Обе функции предназначены для копирования содержимого исходной строки, адресуемой указателем src, в массив символов, назначенный указателем dest. Функция strcpy обеспечивает полное копирование исходной строки, включая завершающий символ с кодом '\0'. Функция strncpy копирует не более, чем задано ее параметра num, начальных символов исходной строки. Когда значение параметра num превышает длину исходной строки, ее копию в назначенном массиве автоматически дополняет соответствующее число символов с нулевым кодом '\0', чтобы общее число символов, записанных в назначенный массив, стало равно num. Если, наоборот, исходная строка по длине больше или равна значению параметра num, то копия исходной строки в назначенном массиве не будет дополнена символом с нулевым кодом '\0'. Чтобы обеспечить корректность копирования, в функции strcpy и strncpy через указатель dest должен быть назначен массив, который имеет размер, достаточный для размещения всех символов копии исходной строки. При успешном завершении обе функции возвращают адрес полученной копии, то есть значение указателя dest.


Следующий фрагмент исходного кода демонстрирует использование функций strcpy и strncpy для инициализации и модификации содержимого массива символов в классе auto данными двух строковых констант:


char os[6];

strcpy (os, "Xenix"); /* инициализация os */

strncpy(os, "Mistake", 2); /* модификация os */


В приведенном примере вызов функции strcpy инициализирует символьный массив os, образуя в нем строку "Xenix". Вызов функции strncpy заменяет первые два символа массива os началом строковой константы "Mistake", превращая "Xenix" в "Minix".


Еще один способ формирования символьных строк предоставляет операция конкатенации. Она применяется для слияния содержимого заданных строк символов в одну строку. Эту конструктивную операцию обработки строк символов реализуют функции strcat и strncat. Спецификации форматов их вызова имеют вид:


char* strcat (char* dest, const char* src);

char* strncat(char* dest, const char* src, unsigned num);


Обе функции выполняют конкатенацию двух символьных строк, добавляя копию всего или части содержимого исходной строки, адресуемой указателем src, в конец строки, назначенной указателем dest. При слиянии строк, символ с нулевым кодом '\0', который завершает строку, назначенную указателем dest, перекрывается начальным символом исходной строки по адресу src. В конец полученной конкатенации автоматически добавляется нулевой код '\0', образуя строку символов, которая доступна по адресу, назначенному указателем dest. Содержимое исходной строки (по адресу src) остается неизменным. Различие обеих функций конкатенации состоит только в том, что функция strcat рассматривает для слияния всю исходную строку, а функция strncat только ее начальную часть, которая содержит не больше символов, чем задано значением параметра num. Если значение параметра num превышает длину исходной строки, то действие функции strncat будет эквивалентно вызову функции strcat. Следует отметить, что корректного выполнения конкатенации необходимо всегда иметь по адресу, назначенному указателем dest, объем памяти, который достаточен для размещения обеих сливаемых строк. При успешном завершении обе функции возвращают адрес полученной конкатенации, то есть значение указателя dest.


При разработке прикладных программ функции strcat и strncat применяют, когда нужно склеить несколько строк в одну строку. Следующий фрагмент исходного кода демонстрирует как использовать функцию strcat, чтобы собрать предложение из отдельных слов, которые заданы в форме строковых констант.


unsigned char sen[64]; /* Массив для символов предложения */

strcpy(sen, "Язык");

strcat(sen, " ");


Случайные файлы

Файл
71111-1.rtf
91987.rtf
168207.rtf
167628.doc
31056.rtf




Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.