Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用cin.get()初始化字符数组_C++_Arrays_String_Cin_Buffer Overflow - Fatal编程技术网

C++ 使用cin.get()初始化字符数组

C++ 使用cin.get()初始化字符数组,c++,arrays,string,cin,buffer-overflow,C++,Arrays,String,Cin,Buffer Overflow,我正在使用cin.get()尝试一些不同的东西,如下所示: char-chArray[30]=“具有大小的字符数组”//当前字符串大小为25个字符,包含空字符 cout固定数组不能动态调整大小。一旦声明了数组,它就不能更改大小(sizeof()在编译时是固定的)。如果您试图输入的字符数超过数组所能容纳的字符数,则代码的缓冲区溢出将损坏周围的内存。在您的示例中,您的数组最多只能容纳30个chars,但您告诉cin,它最多可以在数组中读取100个chars(好吧,99个字符,外加一个空终止符) 对于

我正在使用
cin.get()
尝试一些不同的东西,如下所示:

char-chArray[30]=“具有大小的字符数组”//当前字符串大小为25个字符,包含空字符

cout固定数组不能动态调整大小。一旦声明了数组,它就不能更改大小(
sizeof()
在编译时是固定的)。如果您试图输入的字符数超过数组所能容纳的字符数,则代码的缓冲区溢出将损坏周围的内存。在您的示例中,您的数组最多只能容纳30个
char
s,但您告诉
cin
,它最多可以在数组中读取100个
char
s(好吧,99个字符,外加一个空终止符)

对于要执行的操作,需要读入
std::string
而不是
char[]
数组。
std::string的
size()
可以在运行时动态更改,例如:

#include <string>

std::string str = "character string with size ";
std::cout << str << str.size() << std::endl;
std::cout << "Now we will try to enter more than 30 character in str using cin";
std::cin >> str; // or: std::getline(std::cin, str);
std::cout << str << std::endl << str.size() << std::endl;
#包括
std::string str=“字符串大小”;

std::cout固定数组不能动态调整大小。一旦声明了数组,它就不能更改大小(
sizeof()
在编译时是固定的)。如果您试图输入的字符数超过数组所能容纳的字符数,则代码的缓冲区溢出将损坏周围的内存。在您的示例中,您的数组最多只能容纳30个
char
s,但您告诉
cin
,它最多可以在数组中读取100个
char
s(好吧,99个字符,外加一个空终止符)

对于要执行的操作,需要读入
std::string
而不是
char[]
数组。
std::string的
size()
可以在运行时动态更改,例如:

#include <string>

std::string str = "character string with size ";
std::cout << str << str.size() << std::endl;
std::cout << "Now we will try to enter more than 30 character in str using cin";
std::cin >> str; // or: std::getline(std::cin, str);
std::cout << str << std::endl << str.size() << std::endl;
#包括
std::string str=“字符串大小”;
标准::cout
chArray的大小如何不从30更改为我们使用cin.get()输入的字符串的大小

<> C++中的数组具有固定大小。它们以程序员给定的固定大小在堆栈上创建。这意味着您给了它们一个特定的大小,编译器在编译时就知道了。这个尺寸不变。永远

如果在数组中写入的字符数大于大小,例如在大小为30的数组中写入100个字符,则称为缓冲区溢出缓冲区溢出。它基本上意味着你越过了边界,即固定大小集,在本例中为30

输入的其他字符(在30限制之后)可以在内存中的任何位置移动,因为它们将移动的位置未定义。如果尝试打印此数组,程序将终止,并出现错误:

*** stack smashing detected ***: terminated
这种情况下的错误意味着您试图将超过其容量的数据放入堆栈

< >但是,我们在C++中有<代码>字符串,如果需要一个容器,它可以根据需要改变其大小。例如:

std::string mystr;
标准::cout
chArray的大小如何不从30更改为我们使用cin.get()输入的字符串的大小

<> C++中的数组具有固定大小。它们以程序员给定的固定大小在堆栈上创建。这意味着您给了它们一个特定的大小,编译器在编译时就知道了。这个尺寸不变。永远

如果在数组中写入的字符数大于大小,例如在大小为30的数组中写入100个字符,则称为缓冲区溢出缓冲区溢出。它基本上意味着你越过了边界,即固定大小集,在本例中为30

输入的其他字符(在30限制之后)可以在内存中的任何位置移动,因为它们将移动的位置未定义。如果尝试打印此数组,程序将终止,并出现错误:

*** stack smashing detected ***: terminated
这种情况下的错误意味着您试图将超过其容量的数据放入堆栈

< >但是,我们在C++中有<代码>字符串,如果需要一个容器,它可以根据需要改变其大小。例如:

std::string mystr;

std::cout,因为在数组中输入的字符数超过了数组可以处理的字符数不会改变数组的大小。这只会使程序无效。数组无法更改大小。您声明一个大小为X的数组,它将一直保持大小为X,直到它消失<另一方面,当与正确的函数一起使用时,code>std::string
将更改大小。因为在数组中输入的字符数超过了数组可以处理的数量,不会更改数组的大小。这只会使程序无效。数组无法更改大小。您声明一个大小为X的数组,它将一直保持大小为X,直到它消失<另一方面,当与正确的函数一起使用时,代码>std::string
将更改大小。如果您尝试输入的字符数超过数组所能容纳的字符数,则代码的缓冲区溢出将损坏周围的内存。当数组只能容纳30个字符时,您能否再解释一下其他字符存储在何处,以及周围的内存损坏是如何发生的。这将非常有用。@RahulBalyan剩余的字符只会写入数组后面的内存,覆盖该内存中的任何内容。你也不知道应用程序在内存中存储了什么,如果你试图输入超过数组容量的字符,你的代码会导致缓冲区溢出,从而损坏周围的内存。当数组只能容纳30个字符时,您能否再解释一下其他字符存储在何处,以及周围的内存损坏是如何发生的。这将非常有用。@RahulBalyan剩余的字符只会写入数组后面的内存,覆盖该内存中的任何内容。你不知道应用程序在内存中存储了什么,如果有的话。我想知道这件事正在发生,如果你能解释一下这个字符数组溢出是如何工作的,我明白你关于缓冲区流的观点。但是我没有得到任何错误,我能够打印出精确的数组w