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