#include <iostream>
#include <cstdio>
using namespace std;

class SmartString {
      int Length; // Длина строки
      char* Str; // Строка
      bool Org; // детектор разделения(при копировании копия и оригинал разделяют область памяти, выделенную под символы)
      
public:
       SmartString() {Length = 0; Org = true; Str =(char *)malloc(sizeof(char)); Str = '\0';}// Конструктор без параметров (пустая строка)
       SmartString(const char* st,const int len = 0); // Конструкторы преобразования из «сишной» строки и с указанием длины
       SmartString(const SmartString& a) {Length = a.Length; Str = a.Str; Org = false;};// Конструктор копирования
       char getEl(const int ind) const 
            {
            if (ind <= Length) return Str[sizeof(char)*ind];
             else return '$';
            }; // Метод получения элемента по индексу; возвращает '$' ,если вылезаем за строку
       void chngEl(const int ind, const char c); // Метод изменения элемента по индексу
       int getLen() const {return Length;}; // Метод получения длины строки
       void chngLen(const int len); // Метод изменения длины строки
       ~SmartString() {if (Org) free(Str);} // Деструктор
       };

/* Спецификация: Длина строки считается без символа конца строки, но в каждой строке он есть */     
SmartString:: SmartString(const char* st,const int len)
     {
     int i;
     
     if (len != 0) Length = len; 
        else Length = strlen(st); 
     Str = (char *)malloc(sizeof(char)* (Length + 1)); 
     for (i = 0; i <= Length; i++) Str[sizeof(char)*i] = st[i];
     };
     
/* Спецификация: при уменьшении длины, обрезаем строку*/ 
void SmartString:: chngLen(const int len)
    {
    char* st; 
    int min, i;
    
    st =(char *)malloc(sizeof(char)* (len + 1));
    if (len <= Length) min = len;
    else 
         {
         min = Length;
         for (i = min; i < len; i++) st[i] = ' ';
         }
    for (i = 0; i < min; i++) st[sizeof(char)*i] = Str[sizeof(char)*i];
    st[sizeof(char)*len] = '\0';
    if (Org) free(Str);
    Str = st;
    Length = len;
    Org = true; 
    }
 
/* Спецификация: Ничего не меняем,если вылезаем за строку */    
void SmartString:: chngEl(const int ind, const char c)
    {
    char* st; 
    int i;
    
    if (ind <= Length)
            {if (!Org)
                {
                st = (char *)malloc(sizeof(char)* (Length + 1));
                for (i = 0; i <= Length; i++) st[sizeof(char)*i] = Str[sizeof(char)*i];
                Str = st;
                Org = true; 
                }
    
                Str[sizeof(char)*ind] = c;
            }
    }


int main ()
    {
    SmartString QW("qwerty");
    SmartString QR=QW;
    SmartString QE=QR;
    int i;
    
    QW.chngEl(0,'v');
    QE.chngEl(4,' ');
    QR.chngLen(5);
    for(i = 0;i < QW.getLen(); i++) cout << QW.getEl(i);
    cout << ' ';
    for(i = 0;i < QR.getLen(); i++) cout << QR.getEl(i);
    cout << ' ';
    for(i = 0;i < QE.getLen(); i++) cout << QE.getEl(i);
    cout << ' '; 
    cout << QW.getEl(8) ;
    cout << QR.getLen() ;
    
    for(;;); 
    return 0;
    }
