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

C++ 从cin读取两个字符串并将其写回时出现意外行为,c++,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++)

我被打动了。在本程序中,如果输入为:

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];
    }
}
#包括
int main()
{
chara[8];
charb[8];
标准:cin>>a;
标准:cin>>b;

对于(int i=0;i而言,问题在于您的程序没有分配足够的内存来存储
a
b
输入:为了存储8个字符的文本,您需要分配9个
char
s-最后一个用于C字符串的空终止符:

char a[9];
char b[9];
目前,由于缓冲区溢出,您的程序表现出未定义的行为,这很容易成为黑客利用的最常见问题

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

std::string a;
std::string b;
您需要
#包括
,以编译修改后的代码

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


更好的方法是,使用
std::string
而不是固定长度的C样式字符串,您可以随意输入,而无需任何麻烦。

#offtopic:最基本的程序不应该是“hello world”吗?提示:为null-terminator租用一个房间。为null值保留一个空格,该空格将是行的结尾\0。如果字符串的长度或int为8,则给它一个额外的大小,它应该是9,因为结尾总是有一个null指针。感谢您的回复,而不是投票否决…我是新来的n新生的每个问题都被否决了…为什么是n是否在最后一次输入中显示错误?@Himanshu简短的回答是你很幸运。长的回答是行为是未定义的:你正在向其他空间写入数据,这些空间可能被合法分配给其他数据结构,也可能不被CPU指令使用。如果其他变量/结构未触及该空间,你会得到以下结果:OK;否则,您得到的结果看起来是错误的。您需要使用内存探查器工具(如valgrind)来查找这样的隐藏错误。