当前位置:  开发笔记 > 编程语言 > 正文

C++中的凯撒密码

如何解决《C++中的凯撒密码》经验,为你挑选了2个好方法。

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

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



1> Vincent Robe..:

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

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

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

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



2> Richard Fabi..:

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

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

bool isCaps = ( letter >= 'A' ) && ( letter <= 'Z' );
if( isCaps )
  letter -= 'A'-'a';

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

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

终于完成了

if( isCaps )
  letter += 'A'-'a';

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

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

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有