string (956670)
Текст из файла
ОБРАБОТКА СИМВОЛЬНЫХ СТРОК
Символьная строка - основная структура данных в прикладных программах обработки текстовой информации. В терминах языка программирования 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, " ");
strcat(sen, "программирования");
strcat(sen, " ");
strcat(sen, "Си.");
В этом примере массив символов sen предназначен для формирования в нем текста предложения. Первоначальный вызов функции strcpy инициализирует массив sen символами строковой константы "Язык", образуя первое слово формируемого предложения. Эта инициализация превращает исходный пустой массив в символьную строку. Последующие вызовы функции strcat добавляют к ней строки остальных слов и разделяющие их пробелы, чтобы получить в результате символьную строку, которая содержит предложение:
"Язык программирования Си."
Как известно это название монографии американских авторов Б. Кернигана и Д. Ритчи, которая была опубликована в 1978 году и с тех пор неофициально считается стандартом дефакто языка программирования C.
При обработке текстовой информации часто бывает необходимо сопоставить содержимое заданных символьных строк, выполнив операцию сравнения. Эта операция устанавливает отношение лексиграфического порядка для пары сравниваемых строк путем последовательного анализа кодов их символов на основе следующего формального правила. Пусть индексы i и j обозначают номера символов сопоставляемых строк V и W необязательно равной длины. Тогда строка V считается лексиграфически больше, чем строка W, если существует значение индекса j, при котором выполняются следующие соотношения:
V[j] > W[j] и V[i] == W[i], для всех значений индексов i < j.
Лексиграфическое равенство строк символов означает, что они идентичны. Например, строка символов "Windows XP" лексиграфически больше, чем символьная строка "Windows NT", потому что для кодов их первых различных символов N и X имеет место отношение порядка 'X' > N'. По аналогичным причинам символьная строка "Windows 98", лексиграфически больше, чем строка символов "Windows 2000".
Для полного или частичного сравнения символьных строк предусмотрены функции strcmp и strncmp. Спецификации формата вызова этих функций имеют вид:
int strcmp (const char* str1, const char* str2);
int strncmp(const char* str1, const char* str2, unsigned num);
Обе функции выполняют лексиграфическое сравнение двух строк, адресуемых указателями str1 и str2, последовательно сопоставляя коды их символов. При этом число символов, которые анализирует функция strncmp ограничено значением параметра num. Это позволяет сравнивать начальные части двух строк или символьных массивов. Функция strcmp не имеет параметрических ограничений по диапазону сравнения. Ее следует использовать для полного сравнения заданных строк. Однако, обе функции прерывают сравнение, если достигнут символ с нулевым кодом в любой из адресуемых строк. Поэтому действие функции strncmp эквивалентно обращению к функции strcmp, когда значение параметра num превышает длину любой из сравниваемых символьных строк. Результат сравнения обе функции передают через код возврата. Его значение может быть больше или меньше 0 в зависимости от того, какая из адресованных строк лексиграфически больше, первая или вторая. Во многих реализациях ненулевой возврат равен разности кодов первых несовпадающих символов сравниваемых строк. Нулевой возврат всегда имеет место, когда сравниваемые строки символов идентичны.
При разработке программного обеспечения функции сравнения символьных строк часто применяются для прикладного программирования алгоритмов сортировки и поиска текстовых данных. Прикладное использование функции strcmp демонстрирует следующий пример поиска заданного слова в словаре, где все слова лексиграфически упорядочены по алфавиту. Предполагается, что все слова задают строки символов. Также предполагается, что словарь организован в виде массива строк. Элементы этого массива имеют тип (char *) и содержат адреса слов словаря, кроме последнего элемента, который адресует нулевой указатель NULL, обозначая конец словаря. В прикладной программе такой словарь может быть специфицирован, например, следующим образом:
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.















