第一种:(1) 生成字母表;(2)旋转字母表;(3)完成字母表加密映射;
void Transform(char from[], char to[], char in_out[]) {
char *p = in_out;
for (;*p;p++) {
//printf("%c",*p);
if (*p>='a' && *p<='z') {
*p = *p -'a' + 'A';
char *q = strchr(from,*p);
*p = *(to + (q - from));
*p = *p -'A' + 'a';
}
else if (*p>='A' && *p<='Z') {
char *q = strchr(from,*p);
*p = *(to + (q - from));
}
//printf("%c\n",*p);
}
}
void AlphaShift(char str[],int k) {
int n = strlen(str);
char tmp[k+1];
strncpy(tmp,str+n-k,k);
for (int i=0;i<n-k;i++)
str[n-1-i] = str[n-1-k-i];
for (int i=0;i<k;i++)
str[i] = tmp[i];
}
/*void AlphaShift1(char str[],int k) {
int n = strlen(str);
for (int i=0;i<n;i++)
str[i] = ((str[i] - 'A') - k + n) % n + 'A';
}
*/
const char* AlphaBeta() {
static char s[27] = "";
if (s[0]) {
return s;
}
else {
for (int i=0;i<26;i++)
s[i]='A'+i;
s[26]=0;
}
return s;
}
但是这样过于繁杂,不妨考虑用取模实现循环:
void Caesar(char str[],int k,char out[]) {
int n = strlen(str);
for (int i=0; i<n;i++) {
if (str[i]>='a' && str[i]<='z' ) {
out[i]=(str[i]-'a'+ k + 26) % 26 + 'a';
}
else if (str[i]>='A' && str[i]<='Z') {
out[i]=(str[i]-'A'+ k + 26) % 26 + 'A';
}
else {
out[i] = str[i];
}
}
out[n]=0;
}
这是一种优化的方法。