Как сделать массив строк в си

Обновлено: 30.06.2024

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Массивы данных позволяют хранить большой объем информации в одном месте. В языке Си они представляют возможности для работы со строками. За урок мы научимся работать с массивами и познакомимся с созданием строк.

Видеоурок

Массивы позволяют хранить большой объем информации в одном месте. В языке Си можно найти несколько основных типов массивов.

Одномерный массив

Чтобы создать массив необходимо указать тип данных, прописать название и поставить квадратные скобки. Это очень схоже с созданием обычных переменных, но здесь после названию идут ещё квадратные скобки.

В массивах отсчет начинается с 0, поэтому первый элемент по индексу будет равен 0, второй - 1 и так далее.

Примеры создания массива:

Работать с элементами массива можно точно как с переменными. Мы можем их выводить или же устанавливать для них новые значения.

Многомерный массив

Многомерный массив - это массив, в котором каждый элемент является другим массивом. На практике очень редко используются массивы с более чем третим уровнем вложенности. То есть массивы, в которых все элементы являются другими массивами и в котором все элементы также другие массивы встречаются очень и очень редко на практике.

Мы не будем изучать подобные массивы, так как принцип их построения точно такой же как при работе с двумерными массивами.

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

Мы видим, что элементы первого массива являются другими массивами. Чтобы выбрать какой-либо объект используйте ту же структуру что и для одномерных массивов, вот только теперь указывайте индекс как первого массива, так и второго:

Э то вводная статья по строкам в си. Более подробное описание и примеры будут, когда мы научимся работать с памятью и указателями. В компьютере все значения хранятся в виде чисел. И строки тоже, там нет никаких символов и букв. Срока представляет собой массив чисел. Каждое число соответствует определённому символу, который берётся из таблицы кодировки. При выводе на экран символ отображается определённым образом.
Для хранения строк используются массивы типа char. Ещё раз повторюсь – тип char – числовой, он хранит один байт данных. Но в соответствии с таблицей кодировки каждое из этих чисел связано с символом. И в обратную сторону – каждый символ определяется своим порядковым номером в таблице кодировки. Например

Мы создали две переменные, одна типа char, другая int. Литера 'A' имеет числовое значение 65. Это именно литера, а не строка, поэтому окружена одинарными кавычками. Мы можем вывести её на печать как букву

Тогда будет выведено
A Если вывести её как число, то будет 65 Точно также можно поступить и с числом 65, которое хранится в переменной типа int.
Спецсимволы также имеют свой номер

Здесь будет сначала "выведен" звуковой сигнал, затем его числовое значение, затем опять звуковой сигнал. Строка в си – это массив типа char, последний элемент которого хранит терминальный символ '\0'. Числовое значение этого символа 0, поэтому можно говорить, что массив оканчивается нулём.
Например

Для вывода использовался ключ %s. При этом строка выводится до первого терминального символа, потому что функция printf не знает размер массива word.
Если в этом примере не поставить

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

В данном случае всё корректно. Строка "ABC" заканчивается нулём, и ею мы инициализируем массив word. Строка text инициализируется побуквенно, все оставшиеся символы, как следует из главы про массивы, заполняются нулями.

Чтение строк

Д ля того, чтобы запросить у пользователя строку, необходимо создать буфер. Размер буфера должен быть выбран заранее, так, чтобы введённое слово в нём поместилось. При считывании строк есть опасность того, что пользователь введёт данных больше, чем позволяет буфер. Эти данные будут считаны и помещены в память, и затрут собой чужие значения. Таким образом можно провести атаку, записав нужные байты, в которых, к примеру, стоит переход на участок кода с вредоносной программой, или логгирование данных.

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

Так как числовое значение символа '\0' равно нулю, то можно записать

Теперь напишем программу, которая запрашивает у пользователя два слова и сравнивает их

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

email

Всё ещё не понятно? – пиши вопросы на ящик

Со строками мы с вами работали практически в каждой нашей программе и до этого урока. Точнее со строковыми константами – последовательностью символов в двойных кавычках. Нам часто приходилось выводить на экран ту или иную информацию. Например:

строки в С++

Текст в кавычках и есть строковая константа. Кавычки используются для определения начала и конца строковой константы и её частью не являются.

Итак о первом: в C++ для хранения строк используют символьные массивы. Это такие же массивы, как мы с вами уже рассматривали в статье о массивах в С++, но хранят они не числовые данные, а символьные. Можно представить символы такого массива расположенными последовательно в соседних ячейках памяти – в каждой ячейке хранится один символ и занимает один байт. Один байт потому, что каждый элемент символьного массива имеет тип char. Последним символом каждой такой строки является символ \0 (нулевой символ). Например:

строки в С++, символьные массивы в С++

Сам текст, включая пробел, состоит из 11-ти символов. Если бы в последней ячейке находилась например . (точка), а не нулевой символ \0 – для компилятора это уже не строка. И работать с таким набором символов надо было бы, как с обычным массивом – записывать данные в каждую ячейку отдельно и выводить на экран посимвольно (при помощи цикла):

Читайте также: