C Caesar Cipher错误随机字符串输出

时间:2014-11-02 07:05:22

标签: c encryption

所以我一直在上C课,其中一个练习就是编写一个加密和解密的凯撒密码程序。当输入为“ab cd”时,输出应该是“de#fg”,而是输出“de?g?”。所以我的猜测是空格键混乱了一切。但是当我输入“a”并输出“d?ad?”时,又发现了另一个错误。提前谢谢。

#include <stdio.h>
#include <string.h>

void cipher(char plain_str[], char cipher_str[]);
void decipher(char cipher_str[], char decipher_str[]);

int main() {
    char plain_str[30];
    char cipher_str[30];
    char decipher_str[30];

    printf("Enter plain string: ");
    scanf("%s", plain_str);

    cipher(plain_str, cipher_str);
    decipher(cipher_str, decipher_str);
}

void cipher(char plain_str[], char cipher_str[]) {
    int i = 0;

    while(plain_str[i] != '\0') {
        if((plain_str[i]+3) >= 0 && (plain_str[i]+3) <= 127) {
            cipher_str[i] = plain_str[i] + 3;
        } else {
            cipher_str[i] = plain_str[i] - 124;
        }
        i++;
    }
    printf("%s\n", cipher_str);
}

void decipher(char cipher_str[], char decipher_str[]) {
    //asdf
}

1 个答案:

答案 0 :(得分:0)

%s中的scanf运算符只读取一个单词,而不是整行。因此,如果您输入ab cd,则只有ab被放入plain_str。要阅读整行,请使用fgets()

fgets(plain_str, sizeof(plain_str), stdin);
size_t len = strlen(plain_str);
if (plain_str[len-1] == '\n') {
    plain_str[len-1] = '\0'; // Remove newline
}

另一个问题是,您永远不会将空终止符添加到cipher_str,因此您需要在编码字符后打印其中的任何垃圾。解决此问题的最简单方法是在声明变量时将其初始化为全零数组:

char cipher_str[30] = {0};