C ++中的凯撒密码

时间:2009-02-07 00:26:40

标签: c++ string encryption

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

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

6 个答案:

答案 0 :(得分:6)

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

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

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

这是一个ASCII characters table来帮助您

答案 1 :(得分:5)

一旦你加载了你的字符串,就可以使用modulous运算符进行旋转,同时保持在A-Z空间的范围内。

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

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

答案 2 :(得分:2)

你将不得不学习循环。它们将允许您在字符串的字符上重复一些代码,这正是您在此需要的。你将保留一个整数变量作为你对字符串的索引,并在循环内部对该索引处的字符进行字母转换,并将索引变量递增1,直到达到NULL。

修改:如果您不希望在课程中了解循环,也许他们希望您这样做:

string[0] -= 3; // this is short for "string[0] = string[0] - 3;"
string[1] -= 3;
string[2] -= 3;
...

它只会产生12行代码而不是英里数。您不必以这种方式“重组”字符串,您可以就地编辑每个字符。然后我打赌你做完之后,他们会告诉你使用循环的快速方法。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

for(int i=0; i<12; i++){
  string[i] = string[i] - 3;
}

其中string是您的字符数组(字符串)。如果你想让它成为周期性的话会有更多的参与(I.E.有一个回绕到Z,但上面的代码应该可以帮助你开始)

答案 5 :(得分:1)

我有点不清楚你的意思是“将字母向后移3”? 这是否意味着D ==&gt; ?A
如果是这样,这是一个简单的循环。

(我没有从文件中读取,也没有写入文件......那就是你的部分)

#include <string.h>

int main(void)
{                      
    char input[13] = "ABCDEFGHIJKL";
    int i;

    int len = strlen(input);

    for(i=0; i<len; ++i)
    {
        input[i] = input[i]-3;
    }

    printf("%s", input);  // OUTPUT is: ">?@ABCDEFGHI"
}