在循环C ++中分配字符串后未打印字符串

时间:2018-11-02 22:12:08

标签: c++ string cout xor

在将每个索引分配给循环中的一个值后,我不知道为什么无法打印我的字符串。我可以在循环中的每个索引上打印它,但是我不能仅使用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;
}

3 个答案:

答案 0 :(得分:4)

您的问题出在

final_key[i] = ...

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

这种事情在C ++中具有未定义的行为。也就是说,您不能保证会得到错误;任何事情都有可能发生,包括

  • 代码似乎运行正常
  • 不相关的变量会更改其值
  • 以后随机崩溃

要强制进行错误检查,请使用.at()而不是[]来访问字符串或向量的元素:

final_key.at(i) = ...
// will throw an exception

要附加元素,请使用

final_key.push_back(...);

答案 1 :(得分:3)

问题在于,您在final_key字符串中具有越界访问权限:

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

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

就是这样:

final_key.resize(15);
for (int i = 0; i < 15; ++i )
    final_key[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');

注意:

要显示越界,请使用原始代码(无resize(15)修正),替换为:

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

与此:

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

您应该引发一个std::out_of_range异常,向您显示第i个条目超出范围。

答案 2 :(得分:0)

您可以通过“填充构造函数” 初始化final_key字符串:http://www.cplusplus.com/reference/string/string/string/

string final_key (15, '0');

此初始化使final_key等于 '000000000000000'

现在cout<<final_key;将打印相同的结果:'000010110010000'