/ /ループが文字列の最後の文字を処理しない - c ++、forループ、off-by-one

文字列の最後の文字を処理しないループ - c ++、for-loop、off-by-one

基本的に、(Vigenere)復号化は機能します完全に復号化のための最後の手紙を含めないことを除いて。例えば、m_textの復号化では49文字ではなく48文字になります。ループを操作しようとしたこともありますが、.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は0

物事を見て、あなたは2つをデコードしています一度に文字。したがって、文字列に49文字が含まれていると、残りの1文字が処理されません(m_textを48文字にすると、正しい結果が得られます)。

メッセージの長さに合わせて鍵を複製してから、文字ごとの復号化を行う方が簡単な場合があります。