#include <stdio.h>
#include <string.h>
/*
struct String {
int length;
char* s;
};
*/
class String {
    int length;
    char* s;
public:
    String(const char* p = "");
    String(const String& s) {
        this->length = s.length;
        this->s = new char[this->length+1];
        strcpy(this->s, s.s);
    }
    int getLength();
    String concat(const String& s2);
    ~String();
    void print();
};
/*
String* create(char* p) {
String* r = new String;
r->length = strlen(p);
r->s = new char[r->length+1];
strcpy(r->s, p);
return r;
}
*/
String::String(const char* p) {
    this->length = strlen(p);
    //length = strlen(p);
    this->s = new char[this->length+1];
    //s = new char[length+1];
    strcpy(this->s, p);
    //strcpy(s,p);
}
/*
int getLength(String* s) {
return s->length;
}
*/
int String::getLength() {
    return length;
}

/*
String* concat(String* s1, String* s2) {
String* s3 = new String;
s3->length = s1->length+s2->length;
s3->s = new char[s3->length+1];
strcpy(s3->s, s1->s);
strcat(s3->s, s2->s);
return s3;
}
*/
String String::concat(const String& s2) {
    String s3;
    s3.length = this->length + s2.length;
    delete [] s3.s;
    s3.s = new char[s3.length+1];
    strcpy(s3.s, s);
    strcat(s3.s, s2.s);
    return s3;
}
/*
void print(String* s) {
printf("%s", s->s);
}
*/
void String::print() {
    printf("%s", this->s);
}
/*
void destroy(String* s) {
delete[] s->s;
delete s;
}
*/
String::~String() {
    delete [] this->s;
}

int main() {
    String a("hello");
    String b(" world");

    a.print();
    b.print();
    printf("\n");

    String c = a.concat(b);
    c.print();
    printf("\n");
}