C++ 凯撒密码编码中的包装字符
有谁能解释一下,在凯撒移位码中,a-to-z和a-to-z之间的字符包装是如何发生的C++ 凯撒密码编码中的包装字符,c++,c,ascii,C++,C,Ascii,有谁能解释一下,在凯撒移位码中,a-to-z和a-to-z之间的字符包装是如何发生的 k %= 26; for(int i = 0; i < n; i++){ int c = s[i]; if(c >= 'a' && c <= 'z'){ c += k; if( c > 'z'){ c = 96 + (c % 122); // wrapping from z to a?
k %= 26;
for(int i = 0; i < n; i++){
int c = s[i];
if(c >= 'a' && c <= 'z'){
c += k;
if( c > 'z'){
c = 96 + (c % 122); // wrapping from z to a?
}
}
else if(c >= 'A' && c <= 'Z'){
c += k;
if(c > 'Z'){
c = 64 + (c % 90);
}
}
cout << (char)c;
}
K是移位量,c是字符串s的字符
有没有更好的方法可以做到这一点呢?让我们对代码做一些修改,这样就更容易看到发生了什么
for(int i = 0; i < n; i++){
int c = s[i];
if(c >= 'a' && c <= 'z'){
c += k;
if( c > 'z'){
c = 'a' + (c % 'z') - 1; // wrapping from z to a?
}
}
else if(c >= 'A' && c <= 'Z'){
c += k;
if(c > 'Z'){
c = 'A' + (c % 'Z') - 1;
}
}
cout << (char)c;
}
所以在c='a'+c%'z'-1;如果c大于z,那么我们用z122对c进行mod,以从a中得到需要的字符数。大写字母也是如此。我在这里减去一,因为我们从a开始,而不是像原始代码一样从a之前的字符开始。简单的谷歌搜索,这对您有所帮助。为什么在搜索之前询问?如果k<0,代码会有其他问题。建议k%=26;如果k<0,k+=26;这将与kNote有关:c='a'+c%'z'-1只执行c-='z'-a'+1或c-=26。在国际海事组织,这两个问题中的一个会更清楚。