#include <stdio.h>
#define is_upper(c) ((c) >= 'A' && (c) <= 'Z')
#define is_lower(c) ((c) >= 'a' && (c) <= 'z')
char* cesar_code(int k, char* s);
char* cesar_decode(int k, char* s);
int main(void){
char s[] = "ABCDEF Hello World !!! END zero (XYZ)";
int k = 15;
printf("source str: %s\n", s
); printf("coder str: %s\n", cesar_code
(k
, s
) ); printf("decode str: %s\n", cesar_decode
(k
, s
) ); return 0;
}
//шифратор
char* cesar_code(int k, char* s){
int i;
char* t = s;
k %= 26;
if(k < 0)
k = -k;
for(; *s; ++s){
if(is_lower(*s)){
i = (*s - 'a' + k) % 26;
*s = 'a' + i;
} else if(is_upper(*s)){
i = (*s - 'A' + k) % 26;
*s = 'A' + i;
}
}
return t;
}
//дешифратор
char* cesar_decode(int k, char* s){
int i;
char* t = s;
k %= 26;
if(k < 0)
k = -k;
for(; *s; ++s){
if(is_lower(*s)){
i = *s - 'a' - k;
if(i < 0)
i += 26;
*s = 'a' + i;
} else if(is_upper(*s)){
i = *s - 'A' - k;
if(i < 0)
i += 26;
*s = 'A' + i;
}
}
return t;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNkZWZpbmUgaXNfdXBwZXIoYykgICgoYykgPj0gJ0EnICYmIChjKSA8PSAnWicpCiNkZWZpbmUgaXNfbG93ZXIoYykgICgoYykgPj0gJ2EnICYmIChjKSA8PSAneicpCmNoYXIqIGNlc2FyX2NvZGUoaW50IGssIGNoYXIqIHMpOwpjaGFyKiBjZXNhcl9kZWNvZGUoaW50IGssIGNoYXIqIHMpOwoKCmludCBtYWluKHZvaWQpewoJY2hhciBzW10gPSAiQUJDREVGIEhlbGxvIFdvcmxkICEhISBFTkQgemVybyAoWFlaKSI7CglpbnQgICAgayA9IDE1OwoKCXByaW50Zigic291cmNlIHN0cjogJXNcbiIsIHMpOwoJcHJpbnRmKCJjb2RlciAgc3RyOiAlc1xuIiwgY2VzYXJfY29kZShrLCBzKSApOwoJcHJpbnRmKCJkZWNvZGUgc3RyOiAlc1xuIiwgY2VzYXJfZGVjb2RlKGssIHMpICk7CglyZXR1cm4gMDsKfQoKLy/RiNC40YTRgNCw0YLQvtGACmNoYXIqIGNlc2FyX2NvZGUoaW50IGssIGNoYXIqIHMpewoJaW50ICAgaTsKCWNoYXIqIHQgPSBzOwoKCWsgJT0gMjY7CglpZihrIDwgMCkKCQlrID0gLWs7CgoJZm9yKDsgKnM7ICsrcyl7CgkJaWYoaXNfbG93ZXIoKnMpKXsKCQkJaSAgPSAoKnMgLSAnYScgKyBrKSAlIDI2OwoJCQkqcyA9ICdhJyArIGk7CgkJfSBlbHNlIGlmKGlzX3VwcGVyKCpzKSl7CgkJCWkgID0gKCpzIC0gJ0EnICsgaykgJSAyNjsKCQkJKnMgPSAnQScgKyBpOwoJCX0KCX0KCXJldHVybiB0Owp9CgovL9C00LXRiNC40YTRgNCw0YLQvtGACmNoYXIqIGNlc2FyX2RlY29kZShpbnQgaywgY2hhciogcyl7CglpbnQgICBpOwoJY2hhciogdCA9IHM7CgoJayAlPSAyNjsKCWlmKGsgPCAwKQoJCWsgPSAtazsKCglmb3IoOyAqczsgKytzKXsKCQlpZihpc19sb3dlcigqcykpewoJCQlpID0gKnMgLSAnYScgLSBrOwoJCQlpZihpIDwgMCkKCQkJCWkgKz0gMjY7CgkJCSpzID0gJ2EnICsgaTsKCQl9IGVsc2UgaWYoaXNfdXBwZXIoKnMpKXsKCQkJaSA9ICpzIC0gJ0EnIC0gazsKCQkJaWYoaSA8IDApCgkJCQlpICs9IDI2OwoJCQkqcyA9ICdBJyArIGk7CgkJfQoJfQoJcmV0dXJuIHQ7Cn0K