Строка не печатается после назначения в цикле C ++ - PullRequest
0 голосов
/ 03 ноября 2018

Я не знаю, почему я не могу напечатать свою строку после того, как я назначил каждому индексу значение в цикле. Я могу напечатать его каждый индекс в цикле, но я не могу напечатать строку, используя только cout <</p>

#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 голосов
/ 03 ноября 2018

Проблема в том, что у вас есть доступ за пределами допустимого диапазона в строке 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 выходит за пределы.

0 голосов
/ 03 ноября 2018

Вы можете просто инициализировать строку final_key с помощью «конструктора заполнения» : http://www.cplusplus.com/reference/string/string/string/

string final_key (15, '0');

Эта инициализация позволяет final_key равно '000000000000000'

Теперь cout<<final_key; напечатает тот же результат: '000010110010000'

0 голосов
/ 03 ноября 2018

Ваша проблема в

final_key[i] = ...

final_key - пустая строка (имеет размер 0). Вы пишете для элементов, которые не существуют.

Подобные вещи имеют неопределенное поведение в C ++. То есть вы не гарантированно получите ошибку; может произойти все что угодно, включая

  • код вроде бы нормально работает
  • несвязанные переменные, меняющие свои значения
  • случайные сбои позже

Для принудительной проверки ошибок используйте .at() вместо [] для доступа к элементам строк или векторов:

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

Чтобы добавить элемент, используйте

final_key.push_back(...);
...