C中的简单凯撒密码

时间:2014-11-06 22:50:40

标签: c encryption ascii

我正在使用C中的一个简单的Ceasar Cipher加密程序。我试图让我的儿子更容易解密,所以我遵守这些规则:字母以外的字符不变,而小写和大写字母将保留在他们目前的情况(因此Y增加3将返回B)。密钥和短语将使用单独的文件(我的秘密!)进行管道传输,尽管它的内容样本将是:

4 
This line of text will be encrypted.

我想使用getchar和putchar逐个字符地缓冲它,所以我不必为一个长度总是未知的数组而烦恼。如何检查字符是大写字母还是小写字母,并按给定键增加字符,同时保持与先前的规则一致。 putchar应该在循环内部来缓冲吗?这是我目前的代码

#include <stdio.h>  
int main() { 

   int shift; 
   char msgIn, msgOut;

   // space after to keep is from terminating immediately
   scanf("%d ", &shift);
   msgIn = getchar();

   //increment current character and output until newline
   while (msgIn != '\n') {
     //check for upper or lower, else do nothing
     if((msgIn >= 'A') && (msgIn <= 'Z')) {
        msgOut = msgIn + shift; //increment current character, not sure how to handle this better 
        }
     //checking for lower case 
     else if((msgIn >= 'a') && (msgIn <= 'z')) {
        msgOut = msgIn + shift; //increment current character 
        }
     } 

     putchar(msgOut); //output incremented character
   }

   return 0; 
} 

____修改后的代码

do {
    msgIn = getchar();

    if((msgIn >= 'A') && (msgIn <= 'Z')) {
        putchar(((msgIn - 'A') + shift) % 26 + 'A'); 
        }
    else if((msgIn >= 'a') && (msgIn <= 'z')) {
        putchar(((msgIn - 'a') + shift) % 26 + 'a'); 
        }
    } 
} while (msgIn != '\n');

从你的帮助我认为这个修改后的代码会做得最好,尚未测试但它看起来处理循环,输入,检查ascii情况,处理环绕和输出。

2 个答案:

答案 0 :(得分:1)

请记住,您希望将大写字母保留为大写字母,那么当您转换“Z”时会发生什么?

请查看modulo运算符%以获取帮助。

if (msgIn >= 'A' && msgIn <= 'Z') {
    msgOut = 'A' + (msgIn - 'A' + shift) % ('Z' - 'A' + 1);
}

这是大写字母大小写的一些代码,会导致字母环绕。 'Z'+ 3变为'C'等。

答案 1 :(得分:0)

我猜你的儿子容易理解吗?您可以 使用switch语句或条件,但为了简单起见,这是一个解决方案。

 shift = 0;     
 if (msgIn>64 && msgIn< 88) shift = 3;
 if (msgIn>87 && msgIn< 90) shift = -23;     

 if (msgIn>64 && msgIn< 120) shift = 3;     
 if (msgIn>119 && msgIn< 123) shift = -23;