我正在使用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情况,处理环绕和输出。
答案 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;