凯撒密码 题目描述 为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。输入一个以回车符为结束标志的字符串(少于80个字符),再输入一个整数offset,用凯撒密码将其加密后输出。恺撒密码是一种简单的替换加密技术,将明文中的所有字母都在字母表上偏移offset位后被替换成密文,当offset大于零时,表示向后偏移;当offset小于零时,表示向前偏移。 输入 第一行输入需要进行的解密/加密操作,0表示解密,1表示加密 第二行给出一个以回车结束的非空字符串(少于80个字符) (密文或明文) 第三行输入一个整数offset。 输出 输出加密/解密后的结果字符串输入样例1 Hello Hangzhou 2 输出样例Jgnnq Jcpibjqw
时间: 2024-03-13 21:45:01 浏览: 55
根据题目描述,我们可以使用以下代码实现凯撒密码的加密/解密:
```c
#include <stdio.h>
#include <string.h>
void caesar(char *str, int offset, int encrypt) {
int i;
for (i = 0; i < strlen(str); i++) {
if (str[i] >= 'a' && str[i] <= 'z') {
str[i] = ((str[i] - 'a') + offset * encrypt + 26) % 26 + 'a';
} else if (str[i] >= 'A' && str[i] <= 'Z') {
str[i] = ((str[i] - 'A') + offset * encrypt + 26) % 26 + 'A';
}
}
}
int main() {
int op;
char str[80];
int offset;
printf("请输入操作(0表示解密,1表示加密):");
scanf("%d", &op);
getchar(); // 读入操作后要把回车符吃掉
printf("请输入字符串:");
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\r\n")] = 0; // 去掉字符串末尾的回车符
printf("请输入偏移量:");
scanf("%d", &offset);
caesar(str, offset, op ? 1 : -1);
if (op) {
printf("加密后的字符串为:%s\n", str);
} else {
printf("解密后的字符串为:%s\n", str);
}
return 0;
}
```
在这个实现中,我们定义了一个函数 `caesar` 来进行凯撒密码的加密/解密操作。与之前的实现不同,我们将偏移量作为一个参数传入,并在加密时将其乘以 1,解密时将其乘以 -1。这样就可以复用同一个函数来进行加密和解密操作。
在 `main` 函数中,我们读入操作、字符串和偏移量,并调用 `caesar` 函数进行加密/解密。注意,我们使用 `fgets` 函数来读入字符串,这样可以避免输入带空格的字符串时出现问题。另外,由于 `fgets` 函数会将最后的回车符也读入字符串中,所以我们需要使用 `strcspn` 函数去掉字符串末尾的回车符。
最后,根据操作的类型输出加密/解密后的结果字符串即可。
阅读全文