在循环C++中指定字符串之后,不会打印该字符串

String is not being printed after Assign it in a Loop C++

本文关键字:字符串 打印 之后 C++ 循环      更新时间:2023-10-16

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

您的问题在中

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个条目之前,您必须适当调整其大小,或者连接到空字符串上:

所以要么是这个:

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个条目越界。

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

string final_key (15, '0');

此初始化使final_key等于'000000000000000'

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