Цикл не обрабатывает последний символ строки

По сути, расшифровка (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;
}

1 ответ

Решение

Судя по всему, вы декодируете два символа одновременно. Поэтому, когда в вашей строке 49 символов, остается один (который не обрабатывается). Если вы сделаете m_text длиной 48 символов, вы заметите, что получаете правильный результат.

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

Другие вопросы по тегам