#include <iostream>
using std::cout;
using std::endl;
#include <cstring>
struct String
{
char *buf;
size_t len;
String()
{
len = 0U;
buf = new char[1U];
*buf = '\0';
}
String( const char *cstr )
{
len = strlen( cstr );
buf = new char[len + 1U];
memcpy( buf, cstr, len + 1U );
}
String( const String &str )
{
len = str.length();
buf = new char[len + 1U];
memcpy( buf, str.buf, len + 1U );
}
String &operator=( const String &rhs )
{
if( this != &rhs )
{
this->~String();
len = rhs.length();
buf = new char[len + 1U];
memcpy( buf, rhs.buf, len + 1U );
}
return *this;
}
String operator+( const String &rhs ) const
{
String tmp;
tmp.~String();
tmp.len = this->length() + rhs.length();
tmp.buf = new char[tmp.len + 1U];
memcpy( tmp.buf, this->buf, this->length() + 1U );
strcat( tmp.buf, rhs.buf );
return tmp;
}
size_t length() const
{
return len;
}
~String()
{
delete [] buf;
len = 0U;
}
};
int main()
{
String s1( "123" );
String s2;
String s3 = s1 + s2 + "789";
String s4;
s2 = "456";
s4 = s3 + "0";
cout << s1.buf << endl;
cout << s2.buf << endl;
cout << s3.buf << endl;
cout << s4.buf << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBzdGQ6OmNvdXQ7CnVzaW5nIHN0ZDo6ZW5kbDsKCiNpbmNsdWRlIDxjc3RyaW5nPgoKc3RydWN0IFN0cmluZwp7CiAgICBjaGFyICAgICpidWY7CiAgICBzaXplX3QgIGxlbjsKCiAgICBTdHJpbmcoKQogICAgewogICAgICAgIGxlbiA9IDBVOwogICAgICAgIGJ1ZiA9IG5ldyBjaGFyWzFVXTsKCiAgICAgICAgKmJ1ZiA9ICdcMCc7CiAgICB9CgogICAgU3RyaW5nKCBjb25zdCBjaGFyICpjc3RyICkKICAgIHsKICAgICAgICBsZW4gPSBzdHJsZW4oIGNzdHIgKTsKCiAgICAgICAgYnVmID0gbmV3IGNoYXJbbGVuICsgMVVdOwoKICAgICAgICBtZW1jcHkoIGJ1ZiwgY3N0ciwgbGVuICsgMVUgKTsKICAgIH0KCiAgICBTdHJpbmcoIGNvbnN0IFN0cmluZyAmc3RyICkKICAgIHsKICAgICAgICBsZW4gPSBzdHIubGVuZ3RoKCk7CgogICAgICAgIGJ1ZiA9IG5ldyBjaGFyW2xlbiArIDFVXTsKCiAgICAgICAgbWVtY3B5KCBidWYsIHN0ci5idWYsIGxlbiArIDFVICk7CiAgICB9CgogICAgU3RyaW5nICZvcGVyYXRvcj0oIGNvbnN0IFN0cmluZyAmcmhzICkKICAgIHsKICAgICAgICBpZiggdGhpcyAhPSAmcmhzICkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMtPn5TdHJpbmcoKTsKCiAgICAgICAgICAgIGxlbiA9IHJocy5sZW5ndGgoKTsKCiAgICAgICAgICAgIGJ1ZiA9IG5ldyBjaGFyW2xlbiArIDFVXTsKCiAgICAgICAgICAgIG1lbWNweSggYnVmLCByaHMuYnVmLCBsZW4gKyAxVSApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICAgIFN0cmluZyBvcGVyYXRvcisoIGNvbnN0IFN0cmluZyAmcmhzICkgY29uc3QKICAgIHsKICAgICAgICBTdHJpbmcgIHRtcDsKCiAgICAgICAgdG1wLn5TdHJpbmcoKTsKCiAgICAgICAgdG1wLmxlbiA9IHRoaXMtPmxlbmd0aCgpICsgcmhzLmxlbmd0aCgpOwogICAgICAgIHRtcC5idWYgPSBuZXcgY2hhclt0bXAubGVuICsgMVVdOwoKICAgICAgICBtZW1jcHkoIHRtcC5idWYsIHRoaXMtPmJ1ZiwgdGhpcy0+bGVuZ3RoKCkgKyAxVSApOwogICAgICAgIHN0cmNhdCggdG1wLmJ1ZiwgcmhzLmJ1ZiApOwoKICAgICAgICByZXR1cm4gdG1wOwogICAgfQoKICAgIHNpemVfdCBsZW5ndGgoKSBjb25zdAogICAgewogICAgICAgIHJldHVybiBsZW47CiAgICB9CgogICAgflN0cmluZygpCiAgICB7CiAgICAgICAgZGVsZXRlIFtdIGJ1ZjsKCiAgICAgICAgbGVuID0gMFU7CiAgICB9Cn07CgoKaW50IG1haW4oKQp7CiAgICBTdHJpbmcgIHMxKCAiMTIzIiApOwogICAgU3RyaW5nICBzMjsKICAgIFN0cmluZyAgczMgPSBzMSArIHMyICsgIjc4OSI7CiAgICBTdHJpbmcgIHM0OwoKICAgIHMyID0gIjQ1NiI7CiAgICBzNCA9IHMzICsgIjAiOwoKICAgIGNvdXQgPDwgczEuYnVmIDw8IGVuZGw7CiAgICBjb3V0IDw8IHMyLmJ1ZiA8PCBlbmRsOwogICAgY291dCA8PCBzMy5idWYgPDwgZW5kbDsKICAgIGNvdXQgPDwgczQuYnVmIDw8IGVuZGw7CgogICAgcmV0dXJuIDA7Cn0K