C++中的凯撒密码

5 c++ string encryption

首先,我进入C++课程已有四周时间,我甚至还不知道循环,所以请说说话宝贝?

好的,所以我应该从文件中读取十二个字符串(加上NULL使得十三个),然后将字母向后移三个,然后将结果打印到屏幕和文件.除了换字母之外,我还好.我不想写几英里的代码来单独取每个字符,减去三个,然后重新组合字符串,但我不确定如何一次处理整个字符串.有人可以推荐一种非常简单的方法吗?

Vin*_*ert 6

如果您正在处理简单字母(A到Z或a到z),那么您可以假设内部代码是线性的.

字母编码为0到127之间的数字.A编码为65,B编码为66,C编码为67,Z编码为90.

为了移动字母,你只需更改内部字母代码就好像它是一个数字,所以基本上只是从字符中减去3.但请注意边缘情况,因为将3减去'A'会给你'>'(代码62)而不是'X'(代码88).您可以使用"if"语句或模运算符("%")来处理它们.

这是一个ASCII字符表来帮助您


Ric*_*ian 5

一旦你加载了你的字符串,你可以使用modulous运算符旋转,同时保持在AZ空间的范围内.

我会跟踪这封信是否是开头的资本:

bool isCaps = ( letter >= 'A' ) && ( letter <= 'Z' );
if( isCaps )
  letter -= 'A'-'a';
Run Code Online (Sandbox Code Playgroud)

然后就像这样做密码转换:

int shift = -3;
letter -= 'a'; // to make it a number from 0-25
letter = ( letter + shift + 26 ) % 26;
        // add 26 in case the shift is negative
letter += 'a'; // back to ascii code
Run Code Online (Sandbox Code Playgroud)

终于完成了

if( isCaps )
  letter += 'A'-'a';
Run Code Online (Sandbox Code Playgroud)

所以,把所有这些放在一起我们得到:

char *mystring; // ciphertext
int shift = -3; // ciphershift

for( char *letter = mystring; letter; ++letter )
{
  bool isCaps = ( *letter >= 'A' ) && ( *letter <= 'Z' );
  if( isCaps )
    *letter -= 'A'-'a';

  letter -= 'a';
  letter = ( letter + shift + 26 ) % 26;
  letter += 'a';

  if( isCaps )
    letter += 'A'-'a';
}
Run Code Online (Sandbox Code Playgroud)


小智 1

使用 for 循环迭代字符。并用 char* 做你想做的事。然后把新的字符放回去。