#include <stdio.h>
#include <string.h>

//
// String class with overloaded cat function
//
class String
        {
public:
        String() { ... }
        String(const char *s) { ... }
        String(const String &s) { ... }
        ~String() { delete str; }
        size_t length() { return len; }
        const char *text() { return str; }
        void cat(char c);
        void cat(const char *s);
        void cat(const String &s);
        char &sub(size_t i) { ... }
private:
        size_t len;
        char *str;
        };

//
// append a character to a String
//
void String::cat(char c)
        {
        char *p = strcpy(new char[len + 2], str);
        p[len++] = c;
        p[len] = '\0';
        delete str;
        str = p;
        }

//
// append a nul-terminated string to a String
//
void String::cat(const char *s)
        {
        size_t n = len + strlen(s) + 1;
        char *p = strcpy(new char[n], str);
        strcat(p, s);
        delete str;
        str = p;
        }

//
// append a String to a String
//
void String::cat(const String &s)
        {
        size_t n = len + s.len + 1;
        char *p = strcpy(new char[n], str);
        strcat(p, s.str);
        delete str;
        str = p;
        }

int main()
        {
        size_t i;
        String s1("hello"); // s1 = "hello"
        String s2(s1);      // s2 = "hello"
        s2.cat(',');        // s2 = "hello,"
        s2.cat(' ');        // s2 = "hello, "
        s2.cat(s2);         // s2 = "hello, hello, "
        s2.cat("world");    // s2 = "hello, hello, world"
        printf("s1 = %s\n", s1.text());
        printf("s2 = %s\n", s2.text());
        return 0;
        }

