#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; }
	    // the [] were missing
	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 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;  // the [] were missing
	str = p;
	len = n;        // this line was missing
	}

//
// 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;  // the [] were missing
	str = p;
	len = n;        // this line was missing
	}

// ...

