从cin读取两个字符串并将其写回时出现意外行为

时间:2015-08-21 20:59:41

标签: c++

我很震惊。在此程序中,如果输入为:

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];
    }
}

2 个答案:

答案 0 :(得分:4)

问题是您的程序没有分配足够的内存来存储ab输入:为了存储8个字符的文本,您需要分配9 char s - 最后一个是C字符串的空终止符:

char a[9];
char b[9];

目前,由于缓冲区溢出,您的程序会出现未定义的行为,这很容易被黑客利用。

幸运的是,这个问题有一个非常简单的解决方法:用char替换std::string数组,让你的字符串改变最终用户输入大小的容量,防止缓冲区溢出:

std::string a;
std::string b;

您需要#include <string>才能编译修改后的代码。

答案 1 :(得分:1)

char a[8];
char b[8];
cin>>a;
cin>>b;

如果您为a输入的字符数超过7个,则会覆盖到b,因为cin >> a;会读取带有终止\0的C样式字符串在末尾。设为char a[9]; char b[9];,并假设输入中只有8个字符,它将正常工作。

更好的是,使用std::string而不是固定长度的C样式字符串,您可以输入尽可能多的麻烦。