在循环 C++ 中分配字符串后未打印字符串
String is not being printed after Assign it in a Loop C++
我不知道为什么我在循环中将每个索引分配给一个值后无法打印我的字符串。我可以在循环中打印每个索引,但我不能仅使用 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
个条目越界。
您可以通过 "fill constructor" 初始化 final_key
字符串:http://www.cplusplus.com/reference/string/string/string/
string final_key (15, '0');
这个初始化让final_key
等于'000000000000000'
现在 cout<<final_key;
将打印相同的结果:'000010110010000'
我不知道为什么我在循环中将每个索引分配给一个值后无法打印我的字符串。我可以在循环中打印每个索引,但我不能仅使用 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
个条目越界。
您可以通过 "fill constructor" 初始化 final_key
字符串:http://www.cplusplus.com/reference/string/string/string/
string final_key (15, '0');
这个初始化让final_key
等于'000000000000000'
现在 cout<<final_key;
将打印相同的结果:'000010110010000'