#include #include #include #include #define STRING_INIT {0, 0, 0} struct string { char *data; size_t len; size_t space; }; void add(struct string* s, char *addition){ size_t space_left = s->space - s->len; size_t addition_len = strlen(addition); if(space_left < addition_len){ s->data = realloc(s->data, s->len + addition_len); s->space = s->len + addition_len; } strcpy(s->data + s->len, addition); s->len += addition_len; } void reserve(struct string* s, size_t capacity){ if(capacity < s->len) return; s->data = realloc(s->data, capacity); s->space = capacity; } void set_length_by_null(struct string* s){ s->len = strlen(s->data); } int main(){ struct string animals = STRING_INIT; reserve(&animals, 100); gethostname(animals.data, animals.space); set_length_by_null(&animals); add(&animals, " "); add(&animals, "Zebra "); add(&animals, "Cheetah "); add(&animals, "Sloth "); printf("Animals: %s\n", animals.data); return 0; }