为什么这个 C++ char 数组似乎能够容纳超过其大小的内容?

问题描述 投票:0回答:7
#include <iostream>
using namespace std;

typedef struct
{
    char streetName[5];

} RECORD;

int main()
{
    RECORD r;
    cin >> r.streetName;
    cout << r.streetName << endl;

}

当我运行这个程序时,如果我输入超过 5 个字符,输出将显示我输入的整个字符串。它不会在 5 个字符处截断。这是为什么?

我怎样才能让它正常工作?

c++ g++ char
7个回答
15
投票

您的缓冲区溢出了。在 streetName 之后放置另一个字符数组,您可能会发现它获取了其余的字符。现在你只是破坏了堆栈上的一些内存。


7
投票

为了将输入限制为接收数组的大小,您需要使用输入方法提供的长度限制设施。在您的情况下,您使用的是

cin
,这意味着您可以使用其
width
方法指定限制

cin.width(5);    
cin >> r.streetName;

5
投票

因为 cin 将 streetName 视为 char * 并写入内存,并且没有什么可以阻止写入 *(streetName + 6) 及其他内容。这是缓冲区溢出的一种形式

这种情况下最好的代码是将 streetName 定义为 std::string

typedef struct
{
        std::string streetName;
} RECORD;

5
投票

因为你超出了缓冲区的末尾,在这种特殊情况下你就逃脱了惩罚。 C 和 C++ 很容易让你“搬起石头砸自己的脚”,但这并不意味着你应该这么做。


3
投票
看起来

可以工作。 如果您将该代码放入函数中,当您尝试从该函数返回时,程序很可能会崩溃,因为一种可能的可能性是您将转储到堆栈上的函数返回地址。您还可能损坏了属于调用函数的数据。


3
投票

#include<iostream> #include<string> .... std::string r; getline(cin, r); std::cout << r <<std::endl;

对于截断的输入(具有适当定义和初始化的值)。

while(cin.peek() != EOF && i < len) { cin >> arr[i]; ++i; }

如果您打算用它做其他事情,您将需要在此之后执行一些操作来刷新缓冲区,并且不要将其余的行留在输入流上。


2
投票
缓冲区溢出

© www.soinside.com 2019 - 2024. All rights reserved.