6.2 Обработка матриц строк символов
Pассмотрим теперь использование
матриц для хранения строк символов. Строки символов не фиксированной длины, а
переменной. Идея заключается в следующем: память в матрице распределяем только
для указателей, т.е. элементом матрицы будет указатель. Тем самым необходимо
использовать тройной указатель. Для начала зададим типы.
- #define TYPE char
#define MATR char*** //тройной указатель
Функция вывода сообщения об ошибке
и завершении выполнения программы. Здесь используется специальная библиотечная
функция exit()
- void
ErrorMem()
{
printf("Ошибка: память не
выделена \n");
exit(0);
}
Функция создания копии строки в
динамической памяти
-
char *CreateStr(char *str)
{
char
*ptr;
int
len=strlen(str); //определение количества символов в
строке
ptr=(char*)malloc(len+1);
if (ptr==NULL) ErrorMem(); //выход, если нет памяти
strcpy(ptr,str);
return ptr;
}
Функция создания матрицы
указателей на строки символов
-
TYPE ***GetMem(int m, int n)
{
TYPE ***mas;
int
i,j;
mas=(TYPE ***)malloc(sizeof(mas)*m); //выделение
памяти под вектор строк
if(mas==NULL)
ErrorMem();
for(i=0;
i<m; i++) //выделение памяти под указатели на
строки
{
mas[i]=(char **)malloc(sizeof(*mas)*n);
if(mas[i]==NULL)
ErrorMem();
}
for(i=0;
i<m; i++) //начальная инициализация матрицы строк
for(j=0; j<n; j++)
mas[i][j]=NULL;
return
mas;
}
Функция освобождения памяти,
занимаемой матрицей строк
-
void
FreeMem(TYPE ***mas,int m, int n)
{
int
i,j;
for(i=0;
i<m; i++) //освобождение памяти, занимаемой
строками символов
for(j=0; j<n; j++)
{
if(mas[i][j]!=NULL)
free(mas[i][j]);
}
for(i=0;
i<m; i++) //освобождение памяти, занимаемой
строками матрицы
free(mas[i]);
free(mas); //освобождение
памяти, занимаемой под вектор строк
}
Тестовый пример использования
матрицы строк символов
-
void
TestStringMatrix()
{
int
i, j, k;
MATR mas;
char
*p1="apple",
*p2="pear",
*p3="cucumber",
*p4="tomato";
mas=GetMem(2,2); //динамическое выделение памяти под матрицу(2,2)
mas[0][0]=CreateStr(p1); //присвоение строк элементам матрицы
mas[0][1]=CreateStr(p2);
mas[1][0]=CreateStr(p3);
mas[1][1]=CreateStr(p4);
for(i=0;
i<2; i++) //использование матрицы
for(j=0; j<2; j++)
{
for(k=0;
k<4; k++)
printf("%c",mas[i][j]);
printf("\n");
}
FreeMem(mas,2,2); //освобождение памяти, занимаемой матрицей
getch();
}
|