Опубликован: 14.12.2010 | Доступ: свободный | Студентов: 3124 / 709 | Оценка: 4.53 / 4.12 | Длительность: 26:28:00
Лекция 7:

Символьные массивы в языке С. Работа со строками

< Лекция 6 || Лекция 7: 12345 || Лекция 8 >
Аннотация: В лекции надлежит изучить задание и инициализацию символьных массивов в языке программирования С, изучить решение задач с символьными массивами, изучить базовые функции для работы со строками.

Теоретическая часть

В языке программирования С заложены средства для задания последовательностей упорядоченных данных [6.1]. Такие последовательности называются массивами. В массивах должны быть упорядочены данные одного и того же типа. В данной лабораторной работе будут рассматриваться массивы символов, которые определятся типом char. Одномерный массив наиболее часто применяется в виде строки символов. Строка – это одномерный массив символов, заканчивающийся нулевым символом [1; 2]. В языке С признаком окончания строки служит символ '\0'. При объявлении массива символов, предназначенного для хранения строки, необходимо отвести одно место для нуля, т.е. для символа окончания строки '\0'. Например, если дана строка qwerty, в которой 6 символов, каждый из которых занимает в памяти 1 байт, то при инициализации такой строки необходимо отвести 1 байт для нулевого символа. Поэтому следует сделать объявление строки для семи символов:

char str[7] = "qwerty";

Альтернативным объявлением может служить безразмерная инициализация:

char str[ ] = "qwerty";

При этом в случае определения длины строки результатом будет число 6. Размер строки не изменится, если в ней указать символ окончания строки:

char str[ ] = "qwerty\0";

Аналогично числовым массивам в языке С могут использоваться массивы строк, т.е. набор одномерных массивов символов. Например, сервер базы данных сверяет команды пользователей с массивом допустимых команд [6.2]. В качестве массива строк для этого случая будет служить двухмерный символьный массив. Размер левого измерения определяет количество строк, а правого – максимальную длину каждой строки [6.2]. Например:

char str[30][80];

Число 30 – это количество строк массива, а число 80 – максимальная длина каждой строки с учетом нулевого символа завершения строки.

Чтобы обратиться к отдельной строке двухмерного символьного массива, достаточно указать только левый индекс объявленного массива.

Многомерные символьные массивы образуются, как и числовые массивы:

char str[n][m]...[N];

В объявлении массива n – первая размерность, m – вторая размерность, ..., NN -я (последняя) размерность. Значения размерностей – целые неотрицательные числа.

6.1. Одномерные символьные массивы – строки

Одномерный массив – это список связанных однотипных переменных.

Общая форма записи одномерного массива [6.2]:

тип  имя_массива[размер];

В приведенной записи элемент тип объявляет базовый тип массива. Количество элементов, которые будут храниться в массиве с именем имя_массива, определяется элементом размер.

В языке С индексация массива (символьного или числового) начинается с нуля.

Доступ к отдельному элементу массива осуществляется с помощью индекса. Индекс описывает позицию элемента внутри массива.

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

Для массива символов при инициализации массива необходимо резервировать место для символа окончания строки, т.е. для символа '\0'.

Строковая константа – это набор символов, заключенных в двойные апострофы, например, "hello".

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

char str[7] =  "hello";

Каждая строка содержит на один символ больше, чем задано явно: все строки оканчиваются нулевым символом, имеющим значение 0.

Для одномерных массивов общий размер массива в байтах вычисляется по формуле:

всего байт = размер типа в байтах *  количество элементов

6.2. Двухмерные символьные массивы

Двухмерный массив представляет собой список одномерных массивов.

Общая форма записи двухмерного массива:

тип  имя_массива[размер1] [размер2];

В приведенной записи размер1 означает число строк двухмерного массива, а размер2 – количество столбцов. При этом размерность размер2 определяет максимальную длину для заданного массива. Обычно размер2 задают с некоторым запасом.

В двухмерном массиве позиция любого элемента определяется двумя индексами. Индексы каждого из размеров массива начинаются с нуля.

Место хранения для всех элементов массива определяется во время компиляции. Память, выделенная для хранения массива, используется в течение всего времени существования массива.

Для двухмерных массивов заданного типа общий размер массива в байтах вычисляется по формуле:

всего байт = количество строк * количество столбцов * размер в байтах

Инициализация двухмерного символьного массива может быть определена либо посимвольно, либо построчно, например

char str[3][80] = {
		{'1','2','3','4','5'},
		{'x','y','z'},
		{'A','B','C','D'}
          };

char str2[3][80] = {
		"0123456789",
		"x_y_z",
		"A B C D" };

Число 80 взято с запасом для возможной длины строки. Число 3 – это количество строк двухмерного массива. В обоих случаях могут быть добавлены символы окончания строки ( '\0' ). Символ '\0' не выводится на экран дисплея и не передается в файл, например, в текстовый файл. В то же время необходимо помнить, что каждая строка заканчивается нулевым символом.

6.3. Многомерные символьные массивы

Общая форма записи многомерного массива:

тип  имя_массива[размер1] [размер2]... [размерN];

Индексация каждого размера начинается с нуля. Элементы многомерного массива располагаются в памяти в порядке возрастания самого правого индекса. Поэтому правый индекс будет изменяться быстрее, чем левый (левые). При этом в конце каждой строки подразумевается нулевой символ.

При обращении к многомерным массивам компьютер много времени затрачивает на вычисление адреса, так как при этом приходится учитывать значение каждого индекса [6.2]. Поэтому доступ к элементам многомерного массива происходит значительно медленнее, чем к элементам одномерного. В связи с этим использование многомерных массивов встречается значительно реже, чем одномерных или двухмерных массивов.

Для многомерных массивов общий размер многомерного массива в байтах вычисляется по формуле:

всего байт = размер1 * размер2* ... *размерN * размер типа в байтах

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

Для определения размера типа в байтах применяется функция sizeof(), которая возвращает целое число. Например, sizeof(char).

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

< Лекция 6 || Лекция 7: 12345 || Лекция 8 >
Мухаммадюсуф Курбонов
Мухаммадюсуф Курбонов