C++ 字符串在循环C+中赋值后未打印+;

C++ 字符串在循环C+中赋值后未打印+;,c++,string,cout,xor,C++,String,Cout,Xor,我不知道为什么在我将每个索引分配给循环中的一个值之后不能打印字符串。我可以在循环中的每个索引中打印它,但我不能仅使用cout

我不知道为什么在我将每个索引分配给循环中的一个值之后不能打印字符串。我可以在循环中的每个索引中打印它,但我不能仅使用cout<

#include <iostream>

using namespace std;

int main()
{
    //EXPECTED OUTPUT : 000010110010000

    string string1 = "011011110011000";
    string string2 = "011001000001000";
    string final_key;

    for(int i = 0; i<15; i++) //XOR
     {
        final_key[i] = ((string1[i]-'0') ^ (string2[i]-'0')) + '0';
        cout<<final_key[i]; //it prints correctly.
     }

     cout<<final_key; //it doesnt print anything at all :(
    return 0;
}
#包括
使用名称空间std;
int main()
{
//预计产量:0000101100000
字符串string1=“0110110011000”;
字符串string2=“0110010001000”;
字符串结束键;
对于(inti=0;i您的问题在

final_key[i] = ...
final_key
是一个空字符串(大小为0)。您正在写入不存在的元素

<>这类事情在C++中有未定义的行为。也就是说,你不能保证出错,任何事情都可能发生,包括

  • 代码似乎运行良好
  • 不相关变量改变其值
  • 随后随机崩溃
要强制执行错误检查,请使用
.at()
而不是
[]
来访问字符串或向量的元素:

final_key.at(i) = ...
// will throw an exception
要附加元素,请使用

final_key.push_back(...);

问题是您在这里的
final_key
字符串中有一个越界访问权限:

final_key[i]=((string1[i]-'0')^(string2[i]-'0'))+'0';

由于
final_key
以空字符串开头,因此在访问
i
th条目之前,您必须对其进行适当的大小调整,或者将其连接到空字符串上:

所以要么是这样:

final_key.resize(15);
for (int i = 0; i < 15; ++i )
    final_key[i] = ((string1[i]-'0') ^ (string2[i]-'0')) + '0';
final_键。调整大小(15);
对于(int i=0;i<15;++i)
最后的_键[i]=((string1[i]-'0')^(string2[i]-'0'))+'0';
或者这个:

for (int i = 0; i < 15; ++i )
    final_key += ((string1[i]-'0') ^ (string2[i]-'0')) + '0';
for (int i = 0; i < 15; ++i )
    final_key.push_back(((string1[i]-'0') ^ (string2[i]-'0')) + '0');
for(int i=0;i<15;++i)
最后的_键+=((string1[i]-'0')^(string2[i]-'0'))+'0';
或者这个:

for (int i = 0; i < 15; ++i )
    final_key += ((string1[i]-'0') ^ (string2[i]-'0')) + '0';
for (int i = 0; i < 15; ++i )
    final_key.push_back(((string1[i]-'0') ^ (string2[i]-'0')) + '0');
for(int i=0;i<15;++i)
最后一键。向后推((string1[i]-'0')^(string2[i]-'0'))+'0');

注意:

要显示您正在越界,请在原始代码中(无
resize(15)
fix),替换此代码:

final_key[i]=((string1[i]-'0')^(string2[i]-'0'))+'0';

为此:

final_key.at(i)=((string1[i]-'0')^(string2[i]-'0'))+'0';


您应该得到一个抛出的
std::out\u of_range
异常,显示
i
第个条目超出了范围。

您可以通过填充构造函数初始化
最终的\u键
字符串:

string final_键(15,'0');

此初始化使
最终\u键
等于
'000000000000000'


现在
cout@IslamEl-因为这是一种未定义的行为。它可以做任何事情,包括什么都不做。@IslamEl Rougy——请参阅我的答案和注释部分,以说明如何强制显示错误。稍后将随机崩溃。