БлогNot. Динамическая матрица из строк переменной длины (Си)

Динамическая матрица из строк переменной длины (Си)

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

 пункт "8.5. Динамическое распределение памяти", в конце пункта

Что принципиально изменится от того, что элементами матрицы будут объекты типа char *, а не int или float? С алгоритмической точки зрения - ровным счетом ничего. Ниже приводится листинг демо-программки с комментариями основных действий. Занятая память в примере не особождается, но думаю, из ссылки ясно, что сначала нужно в обратном порядке освободить память, отданную элементам, затем - указателям на строки и в последнюю очередь - указателю на массив указателей.

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <bios.h>
#include <alloc.h>

void pause () {
 printf ("\n Press any key to continue");
 fflush (stdin);
 while (!bioskey(1));
}

void error (int n) {
 unsigned char *msg;
 switch (n) {
  case 1: msg = "No memory";
  break;
  default: msg = "Unknown error";
 }
 printf ("\nError: %s",msg);
 pause ();
 exit (n);
}

void main () {
 unsigned char ***a=NULL;
  //a - указатель на массив указателей на строки матрицы.
  //Так как элементами матрицы тоже будут указатели на строки-элементы,
  //необходимо три звездочки
 int const n=2,m=2; //число строк и столбцов матрицы
 a = (unsigned char ***) malloc (n*sizeof(unsigned char **));
  //Выделяем память под массив указателей на строки матрицы
 if (a==NULL) error (1);
 int i,j,l;
 for (i=0; i<n; i++) {
  a[i] = (unsigned char **) malloc (m*sizeof(unsigned char *));
  //Выделяем память под каждую строку - массив указателй на элементы
  if (a[i]==NULL) error (1);
 }

 //Заполняем матрицу вводом с клавиатуры
 unsigned char buf[80];
 for (i=0; i<n; i++)
 for (j=0; j<m; j++) {
  printf ("\n Enter string for a[%d,%d]:",i,j);
  fflush (stdin);
  fgets (buf,78,stdin); //scanf лучше не использовать для ввода строк
  l=strlen(buf);
  buf[--l]='\0'; //но fgets оставит в конце перевод строки, уберем его
  a[i][j] = (unsigned char *) malloc (l*sizeof(unsigned char));
   //выделяем память под очередной элемент в зависимости от
   //длины буфера
  if (a[i][j]==NULL) error (1);
  strcpy (a[i][j],buf); //копируем буфер в элемент матрицы строк
 }
 //Выводим полученную матрицу на экран консоли
 printf ("\n String matrix:");
 for (i=0; i<n; i++) {
  fputs ("\n",stdout);
  for (j=0; j<m; j++) {
   fputs (a[i][j],stdout);
   fputs ("\t",stdout);
  }
 }
 pause ();
}

 Отправлено в раздел алгоритмов

24.04.2009, 23:36 [13496 просмотров]


теги: textprocessing c++ программирование алгоритм

К этой статье пока нет комментариев, Ваш будет первым