C++ 能否使_唯一存储文字或iostream输入?

C++ 能否使_唯一存储文字或iostream输入?,c++,pointers,c++17,smart-pointers,C++,Pointers,C++17,Smart Pointers,当我通过cin>>ptr使用char类型的普通指针存储的输入时,它被转换为一个数组 我推断,因为首先,cout // 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; 这样更好,c是一个由10

当我通过
cin>>ptr
使用char类型的普通指针存储
的输入时,它被转换为一个数组

我推断,因为首先,
cout

// 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;
这样更好,
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;
您也不能将它与
cin
cout
一起使用,因为它不提供重载。您必须自己编写,或者如果指针类型上存在重载,则可以使用
get
获取指向
unique\u ptr
中存储内容的实际指针

所以,这就给我们留下了

//using of std::string
string str;
cout<<"Enter a str: ";
cin>>str;cout<<endl;
cout<<str<<"\n";
//使用std::string
字符串str;
库斯特;不能首先

// 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;
这样更好,
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;
您也不能将它与
cin
cout
一起使用,因为它不提供重载。您必须自己编写,或者如果指针类型上存在重载,则可以使用
get
获取指向
unique\u ptr
中存储内容的实际指针

所以,这就给我们留下了

//using of std::string
string str;
cout<<"Enter a str: ";
cin>>str;cout<<endl;
cout<<str<<"\n";
//使用std::string
字符串str;


库斯特;coutQuestion:作为用户,
str2
c
str3Ptr
提供的缓冲区中可以存储多少个字符want@VTTNote:我不是说“用户可以输入多少个字符”,我写的是“可以存储多少个字符”。是的,我明白了。当用户被要求这样做时,他会这样写。如果他进入KK,阵列大小将为7,以此类推on@VTTbutstr3Ptr不起作用,它会给出错误。如果它被注释,代码将在@VTTQuestion有效工作:
str2
c
str3Ptr
?作为用户提供的缓冲区中可以存储多少个字符want@VTTNote:我不是说“用户可以输入多少个字符”,我写的是“可以存储多少个字符”。是的,我明白了。当用户被要求这样做时,他会这样写。如果他进入KK,阵列大小将为7,以此类推on@VTTbutstr3Ptr不起作用,它会给出错误。如果它被注释,代码将在@vtthanks有效运行感谢您的详细答案。如果
cin>
输入的输入被视为一个字符数组'cin>>str2;'不应该是未定义的行为。但如果不是,考虑的是什么@NathanOliver@AsmM这不是什么,因为你没有告诉str2指向任何东西。如果希望
str2
指向数组,则需要类似于
char*str2=new char[80]
char*str2=定义的字符数组
是一种已定义的行为,因此文本(我不确定通过
cin>>
获得的输入是否被视为字符数组)被视为使用池的常量数组..等等。为什么没有定义char*str2@NathanOliver@AsmM因为
char*str2没有
str2
指向任何东西。你必须让它指向某个东西
cin
将为您分配存储。@asmmo:
cin>>str2
不会以任何方式改变
str2
。该函数接受您给它的指针,并在它指向的任何位置写入输入。由于您没有将str2指向任何特定的位置,因此它指向一个随机地址,因此该函数将把字节写入内存中的随机位置。这是未定义的,它可能会工作,可能会崩溃,可能会删除文件,或者。感谢您的详细回答。如果由
cin>>
输入的输入被视为字符数组`cin>>str2;'不应该是未定义的行为。但如果不是,考虑的是什么@NathanOliver@AsmM这不是什么,因为你没有告诉str2指向任何东西。如果希望
str2
指向数组,则需要类似于
char*str2=new char[80]
char*str2=定义的字符数组
是一种已定义的行为,因此文本(我不确定通过
cin>>
获得的输入是否被视为字符数组)被视为使用池的常量数组..等等。为什么没有定义char*str2@NathanOliver@AsmM因为
char*str2没有
str2
指向任何东西。你必须让它指向某个东西
cin
将为您分配存储。@asmmo:
cin>>str2
不会以任何方式改变
str2
。该函数接受您给它的指针,并在它指向的任何位置写入输入。由于您没有将str2指向任何特定的位置,因此它指向一个随机地址,因此该函数将把字节写入内存中的随机位置。这是未定义的,它可能会工作,可能会崩溃,可能会删除文件,或者。