【问题标题】:Simple Caesar Cipher Program in CC中的简单凯撒密码程序
【发布时间】:2017-03-14 19:49:00
【问题描述】:

大家好,我开始学习 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 be 它输出到:?$To

谁能帮我弄清楚我做错了什么?

【问题讨论】:

  • 使用fgets 而不是scanf
  • 注意:%s of scanf 不包括空格。
  • ...因为scanf("%s", &amp;code);(在任何情况下都应该是scanf("%s", code);)在第一个空白字符处停止。
  • 我建议一次读取和处理输入的一个字符(例如使用getchar()),而不是先将其全部读入字符串。这不仅可以让您克服当前的问题,而且还可以处理任意长的行,甚至(有一些警告)多行输入。

标签: c encryption caesar-cipher


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

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

【讨论】:

  • 请注意,char ch = (char) i; 是不必要的。 'A'int 类型,您可以始终使用 int,甚至将 int 传递给格式说明符 %c,因为 char 类型无论如何都会提升为 int
  • ^ 对。我想非常清楚地说明 getchar() 返回的东西在 char 的范围内,除非它是 EOF。
  • getchar 返回int,如果char 已签名,则可能超出char 的范围。
猜你喜欢
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多