C中的简单凯撒密码程序

时间:2017-03-14 19:49:00

标签: c encryption caesar-cipher

嘿伙计们我开始学习C,并且我被要求专门编写一个程序,一个caesar密码(因此,想法是用字母表中的三个字母替换消息中的任何字母。 )

我的实现应该读取一行文本然后执行加密或解密,具体取决于读取的第一个字符。如果第一个字符是$,那么我应该加密该行的其余部分,并在输出之前加上字符?。如果第一个字符是?,那么我应该解密该行的其余部分,并在输出之前加上字符$。

所以例如:?呃呃,ru qrw wr eh

输出应为:$是或不是

反之亦然。

所以这是我目前的代码:

#include <stdio.h>

int main(void){
    char code[100], ch;
    int i;

    scanf("%s", &code);

    if(code[0]  == '$'){
        for(i = 0; code[i] != '\0'; ++i){
            ch = code[i];

            if(ch >= 'a' && ch <= 'z'){
                ch = ch + 3;

                if(ch > 'z'){
                    ch = ch - 'z' + 'a' - 1;
                }

                code[i] = ch;
            }
            else if(ch >= 'A' && ch <= 'Z'){
                ch = ch + 3;

                if(ch > 'Z'){
                    ch = ch - 'Z' + 'A' - 1;
                }

                code[i] = ch;
            }
        }
        printf("?%s\n", code);
        return 0;
    }
}

但问题是,它返回第一个字符,并在有空格时停止。 比如我输入:$输出到:?$到

有人可以帮我弄清楚我做错了吗?

1 个答案:

答案 0 :(得分:1)

以下是使用getchar()开始的示例:

#include <stdio.h>

int main() {
    int ch; // Either EOF or one of the chars in 0-255
    while ((ch = getchar()) != EOF) {
        if ('A' <= ch && ch <= 'Z') {
            int offset = ch - 'A';
            printf("%c", 'a' + offset);
        } else {
            printf("%c", ch);
        }
    }
}

现在,这段代码在很多方面并不完美,但它确实展示了如何使用getchar()。每次调用getchar()时,它都会从标准输入中提取下一个char并将其作为int返回。这是因为当输入结束时,它会返回特殊值EOF,该值超出char的范围。

这里的while循环是一个常见的习语。当执行到达循环时,它首先必须调用getchar(),其结果存储在ch中。然后它会检查ch是否为EOF。如果没有,则循环处理读取的字符。否则,它退出并且程序结束。

循环体打印它看到的每个字符,同时将大写字母转换为小写字母。