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

Unexpected behavior when reading two strings from cin and writing them back

本文关键字:写回 意外 串并 字符串 读取 cin 字符 两个      更新时间:2023-10-16

我被击中了。在此程序中,如果输入为:

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

问题是您的程序没有分配足够的内存来存储ab输入:为了存储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;将读取一个末尾有终止的C样式字符串。将其设为char a[9]; char b[9];,并且假设输入中只有8个字符,它将正常工作。

更好的是,使用std::string而不是固定长度的C风格字符串,您可以随心所欲地输入,而不会遇到任何麻烦。