Listing 3

#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;
       }
// End of File