编写一个C语言程序,实现凯撒密码加密和解密功能。 要求:在代码中添加详细的注释,解释每一部分的功能和实现步骤。 1.程序要求能够接受用户输入的字符串和加密位数,然后输出加密后的字符串。 2.程序还要能接受加密后的字符串和相同的位数,输出解密后的原始字符串。
时间: 2024-11-29 19:36:26 浏览: 10
C语言实现凯撒密码加密和解密
```c
#include <stdio.h>
#include <string.h> // 引入字符串处理库
// 凯撒密码加密函数
char* caesar_cipher_encrypt(const char* input, int shift) {
int len = strlen(input);
char* result = (char*)malloc((len + 1) * sizeof(char)); // 动态分配内存,预留空字符
for (int i = 0; i < len; i++) {
if (isalpha(input[i])) { // 判断是否为字母
// 将字母移动shift位,并保持大小写不变
if (isupper(input[i])) {
result[i] = ((input[i] - 'A' + shift) % 26) + 'A';
} else {
result[i] = ((input[i] - 'a' + shift) % 26) + 'a';
}
} else {
result[i] = input[i]; // 非字母字符直接保留
}
}
result[len] = '\0'; // 添加结束符
return result;
}
// 凯撒密码解密函数,与加密函数逻辑类似,只是移位方向相反
char* caesar_cipher_decrypt(const char* input, int shift) {
return caesar_cipher_encrypt(input, -shift); // 解密时将shift取反
}
int main() {
char input[100], encrypted[100];
printf("请输入待加密的字符串: ");
fgets(input, sizeof(input), stdin); // 读取用户输入并忽略行尾换行符
input[strlen(input)-1] = '\0'; // 删除多余的换行符
printf("请输入加密位数: ");
int shift;
scanf("%d", &shift);
encrypted = caesar_cipher_encrypt(input, shift);
printf("加密后的字符串: %s\n", encrypted);
char decrypted[100];
printf("请输入解密位数(应与加密位数相同): ");
scanf("%d", &shift); // 再次读取用户输入作为解密位数
decrypted = caesar_cipher_decrypt(encrypted, shift);
printf("解密后的原始字符串: %s\n", decrypted);
free(encrypted); // 释放加密结果内存
return 0;
}
```
这个C程序实现了凯撒密码的基本加密和解密功能。`caesar_cipher_encrypt`和`caesar_cipher_decrypt`函数分别负责加密和解密过程,它们通过循环遍历输入的字符串,对每个字母进行相应的位移。在主函数中,首先获取用户输入的原始字符串和位数,然后调用加密函数生成加密后的字符串;接着再次询问用户解密位数,用同样的方法进行解密并显示原始字符串。注意,加密和解密过程中都进行了动态内存分配和释放,以避免内存泄漏。
阅读全文