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 (); }
гостевая; E-mail |