所以我一直在上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
}
答案 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};