我目前正在尝试制作替代加密/解密程序。该程序从文件读取并基于用户给定的密钥逐个字符地加密。例如,如果文件显示“ATTACK AT DAWN”并且给出的密钥是“LEMON”,则生成的密文将为“LXFOPV EF RNHR”。
我已经创建了加密功能,但是,它会将值更改为字母数字以外的字符。任何帮助,将不胜感激。我已粘贴以下功能:
void encrypt(ifstream& in_s, ofstream& out_s, char next, char& cypher, int& i, char key[])
{
in_s.get(next); // get character from file
while (!in_s.eof())
{
check_i(i); // check i value is within the constraint for key[4]
if(isupper(next)) // if uppercase run cypher
{
cypher = ((next - 65) + (key[i] - 65) % 26) + 65;
}
else if (islower(next))
{
next = toupper(next); // change to upper
cypher = ((next - 65) + (key[i] - 65) % 26) + 65;
cypher = tolower(cypher); // change to lower
}
else // if blank do nothing
{
cypher = next;
}
cout << cypher;
in_s.get(next); // get next char
i++; // add 1 to i for key[i]
}
}
答案 0 :(得分:0)
operator precedence出现问题。模运算符%
的优先级高于加法。所以,让我们分解你的总和:
cypher = ((next - 65) + (key[i] - 65) % 26) + 65;
这将按照以下方式处理:
cypher = ( next - 65 )
+ ( (key[i] - 65) % 26 )
+ 65;
你真正想要的是模数在整个事情中采取行动:
cypher = ( (next - 65 + key[i] - 65) % 26 ) + 65;
你实际上并不需要那套外围的括号,但它会使它更容易阅读。
答案 1 :(得分:0)
问题是我如何获取数组的输入。 我试图做这样的事情:
cout << "Please enter a 5 character key: ";
cin >> key[5];
当我应该像这样存储数组时:
cout << "Please enter a 5 character key: ";
cin >> key;