.: [предыдущая | оглавление | следующая] :.

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();
}
.: [предыдущая | оглавление | следующая] :.