1

C++ での文字のローテーション 13 転置が、意図したとおりに機能しません。すべての文字は最初に大文字にされたので、ASCII 番号 65-90 のみが関連します。文字が 77 を超える場合は、'A' に折り返される分を差し引きます。

for (int j = 0; j < plainStr.length(); ++j)
{
  int x = plainStr[j];
// if-statement one
  if(x==32)  // keep spaces
  {
    cryptStr = cryptStr + (char)x;
  }
// if-statement two
  if((x>=65) && (x<=77))  // rotate 'A' through 'M' by +13 
  {
    x=x+13;
    cryptStr = cryptStr + (char)x;
  }
// if-statement three      
  if((x>77) && (x<=90))  // rotate 'N' through 'Z' by -26+13=-13
  {
    x=x-13;
    cryptStr = cryptStr + (char)x;
  }

問題は、if ステートメント 1 と 2 が意図したとおりに機能することです。実際、'A' に戻さずに ASCII を直接 +13 転置すると、コードは正常に動作します。しかし、if ステートメント 3 を組み込むとすぐに、正しくない 2 文字の出力が得られ始め、後で復号化できなくなります。例えば:

入力文字列: "THIS IS ALL I GOTS"

出力を与える: "GUHVIF VIF NAYLYL VI TGBGF"

T = G

H = UH

私=Ⅵ

S = F

どうか、私は何が欠けている/見落としていますか???

4

1 に答える 1

4

実行するのに必要なifステートメントは 1 つだけなので、次の 2 つの inelse句があることを確認してください。

  if(x==32)  // keep spaces
  {
    cryptStr = cryptStr + (char)x;
  }
  else if((x>=65) && (x<=77))  // rotate 'A' through 'M' by +13 
  {
    x=x+13;
    cryptStr = cryptStr + (char)x;
  }
  else if((x>77) && (x<=90))  // rotate 'N' through 'Z' by -26+13=-13
  {
    x=x-13;
    cryptStr = cryptStr + (char)x;
  }

現在の方法では、2 番目ifが実行されxた場合に 13 がインクリメントされ、3 番目の if の条件が true と評価されます。

于 2013-12-07T03:27:05.693 に答える