#include <iostream>
using namespace std;
typedef struct
{
char streetName[5];
} RECORD;
int main()
{
RECORD r;
cin >> r.streetName;
cout << r.streetName << endl;
}
当我运行这个程序时,如果我输入超过 5 个字符,输出将显示我输入的整个字符串。它不会在 5 个字符处截断。这是为什么?
我怎样才能让它正常工作?
您的缓冲区溢出了。在 streetName 之后放置另一个字符数组,您可能会发现它获取了其余的字符。现在你只是破坏了堆栈上的一些内存。
为了将输入限制为接收数组的大小,您需要使用输入方法提供的长度限制设施。在您的情况下,您使用的是
cin
,这意味着您可以使用其 width
方法指定限制
cin.width(5);
cin >> r.streetName;
因为 cin 将 streetName 视为 char * 并写入内存,并且没有什么可以阻止写入 *(streetName + 6) 及其他内容。这是缓冲区溢出的一种形式
这种情况下最好的代码是将 streetName 定义为 std::string
即
typedef struct
{
std::string streetName;
} RECORD;
可以工作。 如果您将该代码放入函数中,当您尝试从该函数返回时,程序很可能会崩溃,因为一种可能的可能性是您将转储到堆栈上的函数返回地址。您还可能损坏了属于调用函数的数据。
#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;
}
如果您打算用它做其他事情,您将需要在此之后执行一些操作来刷新缓冲区,并且不要将其余的行留在输入流上。