Лабораторная работа №5
Символьные строки
Цель работы
Приобретение навыков работы со строками.
Темы лекций для предварительной проработки
Модуль 2.4. Операторы организации циклической обработки
Модуль 2.5. Числовые и символьные массивы
Планируемые результаты обучения
В результате выполнения лабораторной работы должны быть сформированы и развиты следующие профессиональные компетенции:
на уровне знаний:
– воспроизводить синтаксис объявления одномерного, многомерного массива как числового, так символьного;
– объяснять стандартные приемы для работы с числовыми и символьными массивами.
на уровне понимания:
– объяснять механизмы доступа к элементам массива посредством индекса и указателя.
на уровне применения:
– выполнять операции с символьными массивами;
– осуществлять ввод и вывод символьных массивов;
– применять стандартные функции для работы со строками.
на уровне анализа:
– анализировать разработанную программу с целью выявления логических ошибок;
– локализовать ошибки выполнения программы с целью их исправления;
– анализировать результаты работы программы.
на уровне синтеза:
– использовать математические методы и вычислительные алгоритмы для решения практических задач;
– проектировать структуру программы;
– организовать работу в группе при совместном решении задачи;
– проектировать тестирование программы;
– защищать выполненную самостоятельную работу;
– принимать верное решение при коллективном решении задачи.
на уровне оценки:
– давать оценку эффективности работы программы, основываясь на использованных структурах хранения данных и способах организации вычислений;
– оценивать возможности структурных типов данных в организации данных программы
.
Теоретические сведения
Массив символов и их инициализация
При определении строк необходимо сообщить компилятору требуемый размер памяти.
Первый способ - инициализация массива при помощи строковой константы.
Например:
char m1[]="Только ограничьтесь одной строкой.";
Здесь оператор инициализировал внешний по умолчанию массив m1 для указанной строки. Этот вид инициализации является краткой формой стандартной инициализации массива:
char m1[]={'T','o','л','ь','k','o','
','o','г'','p','a','н','и','ч','ь','т','e','c','ь','
',o','д','н','o','й','
','c','т','p','o','k','o','й','.','\0'}
Без символа 0 мы имеем массив символов, а не строку. Для той и другой формы компилятор подсчитывает символы и таким образом получает размер памяти. Как и для других массивов, имя m1 является указателем на первый элемент массива:
m1==&m1[0], *m1=='T', и *(m1+1)==m1[1]=='o'
и т.д.
Действительно, мы можем использовать указатель для создания строки. Например:
char *m3="Символьная строка.";
Это почти то же самое, что и
static char m3[ ]="Символьная строка.";
Оба описания говорят об одном: m3 является указателем строки со словами "Символьная строка". В том и другом случае сама строка определяет размер памяти, необходимой для ее размещения. Однако вид их не идентичен.
Функции ввода-вывода строк
№ | Функция | Прототип функции | Операция |
fgets | char *fgets (s, n, stream) char *s; int n; FILE *stream; | прочитать строку из входного потока, включая символ новой строки | |
gets | char *gets (s) char *s; | прочитать строку из стандартного файла ввода stdin | |
fputs | int fputs (s, stream) char *s; FILE *stream; | записать строку в поток stream | |
puts | int puts (s) char *s; | записать строку в стандартный файл вывода stdout. В конце строк записывается символ новой строки. |
Функции для обработки строк
Для выполнения описанных в этом подразделе функций необходимо подключить файл string.h командой #include <string.h>.
№ | Функция | Прототип функции | Операция |
1. | strcat | char *strcat(s1,s2) char *s1, *s2; | сцепить две строки |
2. | strncat | char *strncat(s1,s2,n) char *s1, *s2; int n; | сцепить две строки, причем из второй строки копировать не более n символов |
3. | strcmp | int strcmp(s1,s2) char *s1, *s2; | сравнить две строки в лексикографическом порядке |
4. | strncmp | int strncmp(s1,s2, n) char *s1, *s2; int n; | сравнить первые n символов двух строк |
5. | strcpy | char *strcpy(s1,s2) char *s1, *s2; | копировать строку s2 в строку s1 |
6. | strncpy | char *strncpy(s1,s2,n) char *s1, *s2; int n; | копировать не более n символов строки s2 |
7. | strlen | int strlen(s) char *s; | определить длину строки (число символов без завершающего нулевого символа) |
8. | strchr | char *strchr(s,n) char *s; int n; | найти в строке первое вхождение символа с |
9. | strrchr | char *strrchr(s,c) char *s; int c; | найти в строке последнее вхождение символа с |
10. | strpbrk | char *strpbrk(s1,s2) char *s1, *s2; | найти в строке s1 любой из множества символов, входящих в строку s2 |
11. | strspn | int strspn(s1,s2) char *s1, *s2; | определить длину отрезка строки s1, содержащего символы из множества, входящих в строку s2 |
12. | strcspn | int strcspn(s1,s2) char *s1, *s2; | определить длину отрезка строки s1, не содержащего символы cтроки s2 |
13. | strtok | char *strtok(s1,s2) char *s1, *s2; | выделить из строки s1 лексемы, разделенные любым из множества символов, входящих в строку s2 |