我制作了一个小型加密程序,用于键入rot7和rot13。一切正常,除了两个6个字母uvwxyz。
如果我键入ABCDEFGHIJKLMNOPQRSTUVWXYZ,它加密和解密没问题。但是,如果我输入相同的小写字母,那么uvwxyz不起作用。
话虽如此,我已将ascii表中的所有可写字符作为有效范围,如下所示:
// allow all writable characters from 32 to 255
if ((str[i] >= 32 ) && (str[i] <=255))
{
str[i] -= key;
}
以下是加密过程:
cout << endl;
cout << "Encrypting process started " << endl << endl;
cout << "--------------------------- " << endl;
//get the string length
int i = 0;
int length = str.length();
int key = rot13 ;
int k = 5;
int multiple = 0;
int count = 0;
cout << "the text to encrypt is: " << str << endl;
cout << "text length is: " << length << endl;
cout << "using rot13"<<endl;
cout <<"---------------------------" << endl;
cout << "using rot13" << endl;
//traverse the string
for(i = 0; i < length; i++)
{
count ++;
cout << left;
//if it is a multiple of 5 not the first character change the key
if((multiple = (( i % 5 ) == 0)) && (count != 1) && (key == rot13)){
key = rot7;
}
//if it is a multiple of 5 not the first character change the key
else if((multiple = (( i % 5 ) == 0)) && (count != 1) && (key == rot7) ) {
key = rot13;
}
// Capital letters are 65 to 90 (a - z)
if ((str[i] >= 32) && (str[i] <= 255))
{
str[i] += key;
}
}
return str;
如果允许此范围,大写字母如何工作而不是小写?它可能是因为别的吗?我已经逐步添加了这些捕获内容......希望这有助于
答案 0 :(得分:4)
在您的代码中:
if ((str[i] >= 32) && (str[i] <= 255))
{
if (str[i] + key > 255)
str[i] = ((str[i] + key) % 255 )+ 32;
else
str[i] += key;
}
如果key
的值为13且str[i]
为'u'或更高,则str[i]
的值大于255。
在这种情况下你应该使用modulo %
运算符,这是轮换,而不仅仅是一个转移