Вместо многомерного массива, я думаю, это было бы лучше подходит для struct
: оно более четкое и расширяемое. Если вы хотите увеличить объем данных, то сохранение емкости, которая растет в геометрической прогрессии, имеет гораздо более приятное ограничение. Также хорошая идея отделить интерфейс от логики.
#include <stdlib.h> /* realloc, rand, EXIT_* */
#include <string.h> /* strncpy */
#include <stdio.h> /* printf, perror */
#include <assert.h> /* assert */
struct Appointment {
char desc[1024];
unsigned year, month, day, hour, minute;
};
struct Appointments {
struct Appointment *a;
size_t capacity, next_capacity, number;
};
/** Ensures that {as} has at least {min} entries.
@return Success. */
static int reserve(struct Appointments *const as, const size_t min) {
struct Appointment *a;
size_t c0, c1;
assert(as);
/* Already have enough. */
if(min <= as->capacity) return 1;
/* Calculate increase by Fibbinocci. */
if(!as->a) c0 = 8, c1 = 13;
else c0 = as->capacity, c1 = as->next_capacity;
while(c0 < min) c0 ^= c1, c1 ^= c0, c0 ^= c1, c1 += c0;
assert(c0 < c1);
/* Grow the capacity. */
if(!(a = realloc(as->a, sizeof *a * c0))) return 0;
as->a = a;
as->capacity = c0;
as->next_capacity = c1;
return 1;
}
/** Add to {as} an appointment with appointment values.
@return Success. */
static struct Appointment *appointment(struct Appointments *const as,
const char *desc, unsigned year, unsigned month, unsigned day,
unsigned hour, unsigned minute) {
struct Appointment *a;
assert(as && desc && month && month <= 12 && day && day < 31
&& hour < 24 && minute < 60);
/* Add a new entry. */
if(!reserve(as, as->number + 1)) return 0;
a = as->a + as->number++;
/* Copy (part of?) the data. */
strncpy(a->desc, desc, sizeof a->desc - 1);
a->desc[sizeof a->desc - 1] = '\0';
a->year = year;
a->month = month;
a->day = day;
a->hour = hour;
a->minute = minute;
return a;
}
/** Adds a random appointment to {as}.
@return Success. */
static struct Appointment *add_appointment(struct Appointments *const as) {
char desc[64];
/* Shhh, it's a Poisson distibuition. */
const size_t desc_len = 31 + rand() / (RAND_MAX / 32 + 1);
size_t i;
for(i = 0; i < desc_len; i++) desc[i] = (i ? 'a' : 'A')
+ rand() / (RAND_MAX / 26 + 1);
desc[i] = '\0';
/* http://c-faq.com/lib/randrange.html */
return appointment(as, desc, 2000 + rand() / (RAND_MAX / 100 + 1),
1 + rand() / (RAND_MAX / 12 + 1), 1 + rand() / (RAND_MAX / 28 + 1),
rand() / (RAND_MAX / 24 + 1), rand() / (RAND_MAX / 60 + 1));
}
int main(void) {
struct Appointments as = { 0, 0, 0, 0 };
size_t i = 99, j;
while(--i) if(!add_appointment(&as)) break;
for(j = 0; j < as.number; j++) {
struct Appointment *a = as.a + j;
printf("%04u-%02u-%02uT%02u:%02u %s\n", a->year, a->month, a->day,
a->hour, a->minute, a->desc);
}
free(as.a), as.a = 0;
return i ? perror("Appointments"), EXIT_FAILURE : EXIT_SUCCESS;
}
Лучший способ сохранить дату - это совсем другой вопрос. Например, Какой самый лучший тип данных для хранения даты .