void encrypt(char *string){
int i, shift;
for(i = 0; i < 4; i++){
shift = 12+i;
while(((int)string[i]+shift) > 122){
shift-=26;
}
string[i]+=shift;
}
for(i = 4; i < 6; i++){
shift = 12+i;
while(((int)string[i]+shift) > 90){
shift-=26;
}
string[i]+=shift;
}
for(i = 6; i < 8; i++){
shift = 12+i;
while(((int)string[i]+shift) > 57){
shift-=10;
}
string[i]+=shift;
}
for(i = 8; i < 10; i++){
shift = 12+i;
if((((int)string[i])>=33)&&(((int)string[i])<=47)){
while(((int)string[i]+shift) > 47){
shift-=15;
}
}
else{
while(((int)string[i]+shift) > 64){
shift-=7;
}
}
string[i]+=shift;
}
}
我使用此函数来加密一个10个字符的字符串,其中前4个将是小写字母,接下来的2个将是大写字母,接下来的2个是一些数字,最后2个将是一些特殊字母字符。因此,据推测,它会移动其范围内的每个字符(并将加密的替换包装回到范围的开头,如果它落在其中),具体取决于字符在字符串中的位置。移位等于12+ [字符串中字符的索引]。 (要知道为什么我在最后一个循环中完成了所有这些,你可以在任何ascii chart中看到有两组不同的特殊字符)。
现在的问题是,除了第一个字符外,该函数正在移动其范围内的每个字符。 (好吧,我没有检查它是否给出了正确的替换。我只是看到替换是来自相同的范围(如小写字母的小写字母和数字的数字)并假设它正常工作他们:P)第一个替换是一些奇怪的无法识别的角色。我使用了Borland编译器。是编译器吗?这是代码吗?
答案 0 :(得分:2)
我建议将所有有效字符放入字符串,然后使用%
运算符。
const std::string valid_characters =
"abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*";
const unsigned int shift_offset = 13;
std::string::size_type position = valid_characters.find(incoming_character);
position = (position + shift_offset) % valid_characters.length();
char result = valid_characters[position];
您必须检查position
值,因为如果find
字符串中不存在该字符,std::string::npos
将返回valid_characters
。