Сначала,
// using of ordinary pointer
char* str2;//as if u r assigning array to a pointer
cout<<"Enter a str: ";
cin>> str2;cout<<endl;
cout<<str2;
cout<<endl;
может "работать", но на самом деле это неопределенное поведение. char* str2;
создает указатель, который указывает на что-то, но мы понятия не имеем, что. Попытка сохранить в нем данные с помощью cin>> str2
является неопределенным поведением, поскольку у вас нет разрешения на запись того, на что указывает str2
. Так что этого блока кода следует избегать.
Теперь давайте посмотрим на
//using of arrays
char c[] = "ghfgtgbbb";
cout<<c;
char* cPtr = c;
cout<<"\n"<<cPtr;
cout<<endl;
Это лучше, c
- это массив из 10 символов, и cPtr
инициализируется, чтобы указывать на него, чтобы он был действительным указателем. Вы не делаете ввод с ним, но вы можете, но вы должны убедиться, что вводите не более 9 символов (вы должны оставить место для нулевого терминатора).
Теперь рассмотрим код unique_ptr
. В
//using of mak_unique (gives errors)
auto str3Ptr = make_unique<char>();
cout<<"Enter a str: ";
cin>> str3Ptr;cout<<endl;
cout<<str3Ptr;
cout<<endl;
Вы, по сути, сделали то же самое, что и первый блок кода. auto str3Ptr = make_unique<char>();
Создает уникальный указатель, указывающий на один char
. По крайней мере, у вас есть инициализированная переменная, но она не будет достаточно большой для хранения ввода. Вам нужно будет использовать версию массива и выделить достаточно места для ввода, который вы хотите. Это будет выглядеть как
auto str3Ptr = make_unique<char[]>(80);
^^ number of elements to allocate
Вы также не можете использовать его с cin
или cout
как есть, так как он не обеспечивает перегрузок для этого. Вы должны либо написать свой собственный, либо, если существует перегрузка, которая работает с типом указателя, тогда вы можете использовать get
, чтобы получить фактический указатель на то, что хранится в unique_ptr
.
Итак, это оставляет нас с
//using of std::string
string str;
cout<<"Enter a str: ";
cin>>str;cout<<endl;
cout<<str<<"\n";
Какой правильный способ работы со строками в C ++. Он обрабатывает распределение и освобождение и предназначен для работы со стандартными потоками.