Как создать массив char в c
Перейти к содержимому

Как создать массив char в c

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

Мне нужно сделать массив, содержащий массивы символов (строки). Я сделал как-то так, но меня терзают смутные сомнения. Подскажите, как сделать правильно? Или мой вариант вполне правильный? Память выделять тоже только через Heap, так как программа компилируется без RTL. Можно статически объявлять, главное, чтобы элементы можно было заносить в процессе выполнения.

И сколько места выделять нужно двумерному массиву arr , если 3 массива в нем будет, три?

user avatar

«Корневой» массив содержит указатели. Соответственно, байт под него нужно sizeof(char*) * 3 , если массивов три.

Массивы второго уровня содержат массивы символов с нулём в конце. Соответственно, байт в них должно быть strlen(s) + 1 .

При написании кода arr[0] = «Hello» вы «забываете» прежний указатель, элемент начинает указывать на предвыделенный блок памяти из самой программы. Если вы хотите разместить строку «Hello» в выделенном вами блоке, то можете использовать strcpy .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Массивы в языке Си

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

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

Массив характеризуется следующими основными понятиями:

Элемент массива (значение элемента массива) – значение, хранящееся в определенной ячейке памяти, расположенной в пределах массива, а также адрес этой ячейки памяти.
Каждый элемент массива характеризуется тремя величинами:

  • адресом элемента — адресом начальной ячейки памяти, в которой расположен этот элемент;
  • индексом элемента (порядковым номером элемента в массиве);
  • значением элемента.

Адрес массива – адрес начального элемента массива.

Имя массива – идентификатор, используемый для обращения к элементам массива.

Размер массива – количество элементов массива

Размер элемента – количество байт, занимаемых одним элементом массива.

Графически расположение массива в памяти компьютера можно представить в виде непрерывной ленты адресов.
Расположение массива в памяти

Представленный на рисунке массив содержит q элементов с индексами от 0 до q-1 . Каждый элемент занимает в памяти компьютера k байт, причем расположение элементов в памяти последовательное.

Адреса i -го элемента массива имеет значение

n+k·i

Адрес массива представляет собой адрес начального (нулевого) элемента массива. Для обращения к элементам массива используется порядковый номер (индекс) элемента, начальное значение которого равно 0 . Так, если массив содержит q элементов, то индексы элементов массива меняются в пределах от 0 до q-1 .

Длина массива – количество байт, отводимое в памяти для хранения всех элементов массива.

ДлинаМассива = РазмерЭлемента * КоличествоЭлементов

Для определения размера элемента массива может использоваться функция

Объявление и инициализация массивов

Для объявления массива в языке Си используется следующий синтаксис:

тип имя[размерность]=;

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

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

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

При обращении к элементам массива индекс требуемого элемента указывается в квадратных скобках [] .

Результат выполнения программы:
Массив из 5 элементов

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

Для задания начальных значений элементов массива очень часто используется параметрический цикл:

Результат выполнения программы
Массив

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

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

Общая форма объявления многомерного массива

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

Двумерный массив

Общее количество элементов в приведенном двумерном массиве определится как

КоличествоСтрок * КоличествоСтолбцов = 2 * 3 = 6.

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

КоличествоЭлементов * РазмерЭлемента = 6 * 4 = 24 байта.

Инициализация многомерных массивов

Значения элементов многомерного массива, как и в одномерном случае, могут быть заданы константными значениями при объявлении, заключенными в фигурные скобки . Однако в этом случае указание количества элементов в строках и столбцах должно быть обязательно указано в квадратных скобках [] .

Результат выполнения
Матрица 2x3

Однако чаще требуется вводить значения элементов многомерного массива в процессе выполнения программы. С этой целью удобно использовать вложенный параметрический цикл.

Результат выполнения
Результат выполнения

Передача массива в функцию

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

  • адрес массива,
  • размер массива.

Исключение составляют функции обработки строк, в которые достаточно передать только адрес.

При передаче переменные в качестве аргументов функции данные передаются как копии. Это означает, что если внутри функции произойдет изменение значения параметра, то это никак не повлияет на его значение внутри вызывающей функции.

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

Пример на Си Дан массив из 10 элементов. Поменять местами наибольший и начальный элементы массива. Для операций поиска максимального элемента и обмена использовать функцию.

Результат выполнения
Поменять местами наибольший и первый элементы массива

Пример на Си Дан массив размерности n. Вычислить произведение четных элементов

Результат выполнения
Произведение четных элементов массива

Комментариев к записи: 135

int choice; //обраний пункт меню
double arr_C[100]; //одновимірний масив c
int n; //кількість елементів масиву c
double a, b;
int j;
int index;
double k;

//введення кількості елементів масиву B
printf( "\nУведіть кількість елементів масиву C(n)-(максимум 100) = " );

while (1)
if (scanf( "%d" , &n)!=1 n <= 0)
//якщо не виконуються умови-виведення запиту на повторне введення
printf( "Ви ввели неправильне значення. Спробуйте ще раз:\n" );
while (getchar() != '\n') //очистка буфера вводу та очікуання на правильний результат
continue;
>
else if (n > 100)
//якщо переповнення масиву-виведення запиту на повторне введення
printf( "Забагато елементів. Спробуйте ще раз:\n" );
while (getchar() != '\n') //очистка буфера вводу та очікуання на правильний результат
continue;
>
else
break ;
>
//введення елементів масиву B
for ( int i = 0; i < n; i++) printf( "arr_C[%d] = " , i);
while (scanf( "%lf" , &arr_C[i])!=1)
//якщо не виконуються умови-виведення запиту на повторне введення
printf( "Ви ввели неправильне значення. Спробуйте ще раз:\n" );
while (getchar() != '\n') //очистка буфера вводу та очікуання на правильний результат
continue;
>
>
a = DInput( "Введіть a:" );
b = DInput( "Введіть b:" );

k=0;
for (j=0; j<n; j++)
if ((arr_C[j]<a)(arr_C[j]>b)) if (k == 0)
index = j;
if (k == 1) arr_C[j] = arr_C[index];
arr_C[index] = arr_C[j];
break ;
>
k++;
>

Добавить комментарий

Ваш адрес email не будет опубликован.