/ / Цикл не обробляє останнього символу рядка - c ++, for-loop, off-by-one

Цикл не обробляє останній символ рядка - c ++, для-циклу, окремо

В основному, (Vigenere) розшифрування працюєідеально за винятком того, що не включають остаточний лист для розшифровки. Наприклад, розшифровка m_text дає 48 літер замість 49. Я навіть намагався маніпулювати циклом, але це не спрацьовує добре, оскільки я отримаю виняток із діапазону за допомогою .at (). Будь-яка допомога буде вдячна!

using namespace std;
#include <string>
#include <iostream>


int main()

{
string ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

string m_text = "ZOWDLTRTNENMGONMPAPXVUXADRIXUBJMWEWYDSYXUSYKRNLXU";

int length = m_text.length();

string key = "DA";

string plainText = "";

int shift = 0;

int shift2 = 0;



//Loop that decrypts
for (int k = 0; k < length-1; k+=2)
{
//Key 1 shift
shift = m_text.at(k) - key.at(0);
//Key 2 shift
shift2 = m_text.at(k+1) - key.at(1);

if (shift >= 0)
{
plainText += ALPHABET.at(shift);
}
else
{
shift += 91;
plainText += (char)shift;
}

if (shift2 >= 0)
{
plainText += ALPHABET.at(shift2);
}
else
{
shift2 += 91;
plainText += (char)shift2;
}
}
cout << plainText << endl;
}

Відповіді:

0 для відповіді № 1

За зовнішнім виглядом речей ви розшифровуєте двісимволів за раз. Отже, якщо у вашому рядку 49 символів, залишився один (який не обробляється). Якщо ви зробите m_text довжиною 48 символів, ви помітите, що отримаєте правильний результат.

Можливо, буде простіше копіювати ключ, щоб він відповідав довжині повідомлення, а потім зробіть розшифровку символів за символом.