从cin读取两个字符串并将其写回时出现意外行为
Unexpected behavior when reading two strings from cin and writing them back
我被击中了。在此程序中,如果输入为:
11110000
11110000
输出应为:
11110000
11110000
但我得到的是输出:
1110000
11110000
我的代码:
#include <iostream>
int main()
{
char a[8];
char b[8];
std::cin >> a;
std::cin >> b;
for (int i=0; i<8; i++) {
std::cout << a[i];
}
std::cout << "n";
for (int j=0; j<8; j++) {
std::cout << b[j];
}
}
问题是您的程序没有分配足够的内存来存储a
和b
输入:为了存储8个字符的文本,您需要分配9个char
s-最后一个是C字符串的null终止符:
char a[9];
char b[9];
目前,由于缓冲区溢出,您的程序表现出未定义的行为,这很容易成为黑客利用的最常见问题。
幸运的是,这个问题有一个非常简单的解决方案:用std::string
替换char
阵列可以让字符串根据最终用户输入的大小改变容量,防止缓冲区溢出:
std::string a;
std::string b;
您需要#include <string>
才能编译修改后的代码。
char a[8];
char b[8];
cin>>a;
cin>>b;
如果为a
输入超过7个字符,它将覆盖到b
中,因为cin >> a;
将读取一个末尾有终止