我目前正在做一个caesar密码程序。它应该加密大小写。
e.g 如果我输入a,它会将键移动3,最终输出将变为d。
看看我的代码
char c;
c = (((97-52)+3) % 26) + 52;
cout << c;
字母'a'的ASCII码为97。
所以正确
1) ((97-52)+3) will give you 48
2) 48 % 26 will give you 8 since 48/26 will give you a remainder of 8.
3) 8 + 52 = 60(which will by right give you a value of '>' according to the ascii table)
但是我得到的输出是J,我不明白我从哪个输出'J'而不是'&gt;'
我的概念可能有误,所以我需要帮助。
答案 0 :(得分:0)
让我链接我先使用的ASCII图表:http://pl.wikipedia.org/wiki/ASCII 该网站很精致,但桌子本身是英文的。
我认为很明显问题是你使用的等式:
(((letter-52)+3) % 26) + 52;
实际上,ASCII中的第一个字母为65
(十六进制0x41
- 按照提供的图表进行操作)。
如果在ASCII中的字母块之间没有字符,那么使用模数的想法就可以了。但有(再次检查图表)。
这就是为什么你应该手动检查标志:
if (letter >= 0x41 && letter <= 0x5a)
if (letter >= 0x61 && letter <= 0x7a)
通常在制作Ceasar密码时,您应该遵循这些:
现在让我们实现这个(在代码中我将使用字符的字母值 - 以避免错误):
#include <iostream>
#include <cstdlib>
using namespace std;
string Ceasar(string input, int offset)
{
string result = "";
for (int i = 0; i < input.length(); ++i)
{
// For capital letters
if (input[i] >= 'A' && input[i] <= 'Z')
{
result += (char) (input[i] - 'A' + offset) % ('Z' - 'A') + 'A';
continue;
}
// For non-capital
if (input[i] >= 'a' && input[i] <= 'z')
{
result += (char) (input[i] - 'a' + offset) % ('z' - 'a') + 'a';
continue;
}
// For others
result += input[i];
}
return result;
}
int main()
{
cout << Ceasar(string("This is EXamPLE teXt!?"), 8).c_str();
system("PAUSE");
}