C++ cin>&燃气轮机;书写超出范围?

C++ cin>&燃气轮机;书写超出范围?,c++,memory-management,C++,Memory Management,我有密码 char s[5]; cin >> s; cout << strlen(s); cout << endl; cout << s; chars[5]; cin>>s; 库特 是某种东西,但与5无关strlen适用于C字符串,这些字符串是字符数组,但它们的长度定义为第一个零字节之前的字符数 现在,您第二行中的cin无法知道您的char[]有多长,因此它只接受尽可能多的输入。对于您不知道格式正确的输入,决不能使用字符缓冲区。您看到的是缓冲区溢

我有密码

char s[5];
cin >> s;
cout << strlen(s);
cout << endl;
cout << s;
chars[5];
cin>>s;
库特
是某种东西,但与
5
无关
strlen
适用于C字符串,这些字符串是字符数组,但它们的长度定义为第一个零字节之前的字符数

现在,您第二行中的
cin
无法知道您的
char[]
有多长,因此它只接受尽可能多的输入。对于您不知道格式正确的输入,决不能使用字符缓冲区。您看到的是缓冲区溢出正在发生。写入不属于您分配的任何变量的内存会导致未定义的行为,因此您的程序可能会正常工作、崩溃,例如SEGFULT(访问操作系统从未提供给您的内存),或者覆盖进程内存的现有部分,或者…做任何事情,因为它确实未定义

<>你写C++,不是C,只是< /p>
string s;
cin >> s;
cout << s.length()
<< endl
<< s;
字符串s;
cin>>s;

cout你是对的,如果你写的字符超过5个,它可能仍能正确响应。您只需写下缓冲区的末尾,然后清空为
chars[5]
分配的内存旁边的内存。这是不好的,原因有很多,包括安全漏洞。有关详细信息,请参阅


如果无法使用
字符串
(无论出于何种原因),请使用
fgets
。有关
fgets
及其使用方法的文档,请参阅从不使用
获取
。这几乎等同于您上面所做的,请参见。

我正在使用,我的IDE是Windows上的Code::Blocks。请将这些详细信息放在问题中。谢谢,我只是在做我不能使用的家庭作业。我知道strlen正在搜索“\0”。通过‘cin’控制溢出有什么简单的方法吗?或者我必须通过‘for’和‘getchar()’逐字符地输入它?@Pavel:你能用什么和不能用什么肯定是你的问题。请更新你的问题。谢谢,你能告诉我如何避免这种记忆的爆炸吗?如果你在C++,我建议做Marcus Muller建议的。如果您使用的是C语言,那么可以使用
fgets
,它使用一个参数确保您的输入只能很长。如果输入更长,它将只读取您指定的字节数,而不再读取。谢谢,这正是我所需要的伟大!很乐意帮忙。如果情况是这样,我会把问题的标签改成C,而不是C++。尽管它们有相似之处,但它们也不同:)我使用C++,但我不能使用,因为这是作业,我只能使用简洁的LIBs。
string s;
cin >> s;
cout << s.length()
<< endl
<< s;