Pers.narod.ru. Алгоритмы. Динамическая матрица из строк переменной длины |
Итак, мы хотим сделать не просто двумерную матрицу на Си, а такую матрицу, элементы которой в свою очередь будут указателями, под которые можно выделить память. "Совсем начинающим" советую сначала разобраться, как на Си вообще сделать динамическую матрицу, об этом - по ссылке ниже:
пункт "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 ();
}
|
|