【问题标题】:What is the difference between char[5] and char[10]? [duplicate]char[5] 和 char[10] 有什么区别? [复制]
【发布时间】:2020-07-29 14:12:27
【问题描述】:

我知道,在 char[] 中,我们在方括号之间写下字符的长度。

例如,如果我们写 char[10],它应该给我们 10 个字符或更少。

但是,在我的代码中,我输入我的名字“Ramunas”(这是 7 个字符),而不是给我 5 个字符(Ramun),它最终仍然给出“Ramunas”。为什么会这样?

#include <iostream>
using namespace std;
int main()
{
    char a[5];
    cout<<"Hello, enter your name: "<<endl;
    cin>>a;
    cout<<a<<endl;
    return 0;
}

【问题讨论】:

  • 这是因为程序有未定义的行为。您覆盖了数组之外的内存。
  • 请注意,当您计算空终止符时,“Ramunas”是 8 个字符。另请注意,“Ramūnas”在 unicode 编码中可能包含更多字符。
  • 这里是一个例子。一切似乎都是正确的,但你覆盖了变量 i: wandbox.org/permlink/p2LpOvIrVat3laaa

标签: c++


【解决方案1】:

这称为缓冲区溢出。 cin 只知道数组的地址,不检查该地址后面分配(或未分配)内存的大小。

cout 也不在这里进行任何检查。它开始在提供的地址读取字符,直到找到'\0'。

在这种情况下,您可以通过明确限制cin 接受的字符数来防止缓冲区溢出。

cin >> std::setw(5) >> a

【讨论】:

    猜你喜欢
    • 2014-07-28
    • 2012-08-14
    • 2011-04-23
    • 2014-02-15
    • 2015-01-17
    • 2016-06-20
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多