C ++ ROT-13给出了我没想到的结果

时间:2013-12-07 03:24:05

标签: c++ encryption rot13

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本身是按预期工作的。事实上,如果我只是直接+13转换ASCII而不回绕到'A',代码工作正常。但是,只要我将if语句三合并,我开始得到两个不正确的输出,并阻止我以后解密。例如:

输入字符串:“这就是我所有的一切”

给出输出:“GUHVIF VIF NAYLYL VI TGBGF”

T = G

H = UH

I = VI

S = F

拜托,我错过了什么/俯视???

1 个答案:

答案 0 :(得分:4)

您只需要执行if个语句中的一个,因此请确保在else子句中有后两个:

  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;
  }

现在你的方式,如果第二个if被执行,那么x增加13,这使得第三个if条件评估为真。