c - C 语言的简单凯撒密码程序

标签 c encryption caesar-cipher

嘿伙计们,我开始学习 C,我被要求专门编写一个程序,一个凯撒密码(所以,我们的想法是用字母表中三个位置的字母替换消息中的任何字母。)

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

例如:?Wr eh, ru qrw wr eh

输出应该是:$To be, or not to be

反之亦然。

这是我到目前为止的代码:

#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;
    }
}

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

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

最佳答案

这是使用 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。如果不是,则循环处理读取的字符。否则,它退出并且程序结束。

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

关于c - C 语言的简单凯撒密码程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42795258/

相关文章:

c - 为什么我应该使用双指针变量来接收另一个指针的地址(&ptr1)

c - 为什么 SDL 使 3 个事件提前发生?

php - 如何从 AES 加密字符串中添加/删除 PKCS7 填充?

python - 在 Python 中实现 AES/ECB/PKCS5 填充

java - RSA加密问题

c - 链接多个 .c 文件

c - 替换链表中的节点

python - 我无法让我的 python 加密程序正常工作

javascript - 删除逗号并使其成为字符串?

c - 如何使用 C 语言中的文件编写凯撒密码加密代码