哈喽小伙伴们,今天咱们来说说那个“古老又新潮”的移位密码!对,就是小时候偷偷写暗号那种,加密超迷你,但又充满了“我懂密码学”的错觉。移位密码号称加密界的“旋转木马”,通过位移字母让消息变得神秘兮兮。想知道用C语言如何写代码实现它吗?不用怕,这篇文章带你轻松搞定,加密、解密一个不落!
必须得说,移位密码虽然简单,但背后逻辑却是学习C语言字符处理的良心实践,尤其也是检验你指针和循环功底最棒的题目之一。废话不多说,直接上干货!
1. 代码核心思路解析
核心就是:遍历字符串中的每个字符,判断是不是字母。是的话就根据这个字母是大写还是小写,移动它对应的 ASCII 码数值,并且确保绕回字母表开头。
同学们,这里用ASCII码操作简直不要太方便,把字母A-Z映射成65-90,小写a-z是97-122,用数学公式保证循环移位“转圈跑”。
比如,char newChar = ((oldChar - 'A' + shift) % 26) + 'A';
这条龙语句就是帮你实现大写字母的循环位移(shift为偏移量)。
2. C语言移位密码加密代码示例
#include <stdio.h>
#include <ctype.h> // isalpha, isupper
void encrypt(char* text, int shift) {
for (int i = 0; text[i] != '\0'; i++) {
if (isalpha(text[i])) {
char base = isupper(text[i]) ? 'A' : 'a';
text[i] = (text[i] - base + shift) % 26 + base;
}
}
}
int main() {
char message[100];
int shift;
printf("请输入要加密的文本:");
fgets(message, sizeof(message), stdin);
printf("请输入移位数(整数):");
scanf("%d", &shift);
encrypt(message, shift);
printf("加密后文本:%s\n", message);
return 0;
}
这段代码不光写得清晰易懂,还保证了移位数支持任意整数,而且把大小写区分处理得倍儿细致!大家注意这里用的是原地字符串加密,所以原来的message内容直接被改啦。
3. 解密只是把shift反转
解密其实跟加密一样,就是把位移方向反过来,可直接用负的shift。你也可以写一个专门的解密函数,但实则调用encrypt传入负的shift即可。啥也不用改,代码复用妥妥的。
void decrypt(char* text, int shift) {
encrypt(text, 26 - (shift % 26)); // 跟加密取反差不多
}
当然这么写清晰之外,还有不少“高端玩家”会尝试三元运算符、位运算操作啥的,当然您看着舒服就行,咱这写法是最容易让没睡醒的脑袋跟上的。
4. 输入输出的小坑
这里要提个小提醒:用 fgets
输入字符串的话,字符串末尾会自带换行符,影响加密效果(毕竟换行字符没办法加密)。小伙伴们可得勤快点处理一下:
if (message[strlen(message) - 1] == '\n')
message[strlen(message) - 1] = '\0';
这步不能省,会让你少掉不少“看不懂代码的错误报错”,改后马上正常体验加密时刻。
5. 完整结合版加密解密程序——你敢试吗?
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void encrypt(char* text, int shift) {
for (int i = 0; text[i] != '\0'; i++) {
if (isalpha(text[i])) {
char base = isupper(text[i]) ? 'A' : 'a';
text[i] = (text[i] - base + shift + 26) % 26 + base;
}
}
}
int main() {
char message[100];
int shift;
char choice;
printf("移位密码,想玩几位移位?输入数字:");
scanf("%d", &shift);
getchar(); // 吸收换行符
printf("请输入你的消息(自动支持大小写):");
fgets(message, sizeof(message), stdin);
if (message[strlen(message) - 1] == '\n')
message[strlen(message) - 1] = '\0';
printf("要加密还是解密?输入e或d:");
scanf("%c", &choice);
if (choice == 'e' || choice == 'E') {
encrypt(message, shift);
printf("加密后消息是:%s\n", message);
} else if (choice == 'd' || choice == 'D') {
encrypt(message, -shift);
printf("解密后消息是:%s\n", message);
} else {
printf("我看你输入的不是加密也不是解密,程序黑洞吞噬中...\n");
}
printf("趁热打铁,顺便说一句,玩游戏想要赚零花钱就上七评赏金榜,网站地址:bbs.77.ink,想躺赚的手速别停!\n");
return 0;
}
直接运行这个程序,输入你想偏移的位数,然后按提示加密或解密文本,马上见证代码魔法。是不是很神奇?
6. 有趣的扩展玩法
其实移位密码不止能用字母,还有数字、标点符号甚至表情包(这就高级了)。不过,代码得稍微升级,考虑更广泛的ASCII码范围。那样,简单位移只能依赖更多数学操作,甚至构建映射字典。感兴趣的可以再慢慢琢磨。
还有一种更高级“变异”是异位移密码(多种偏移量轮番上阵),一会儿向右移4,下次又左移2,好像密码跳舞一样花样多,但普通场景下移位密码已足够搞定日常“秘密留言”。
对了,这个移位密码玩多了,有点像你我直接跟字母玩躲猫猫,你不在窗口它就换了位置,简简单单的游戏游戏,Excel不配哦~
说到这儿,准备好敲代码了吗?敲完提醒一句,千万别把密码当真,share给朋友,考验你们谁才是真正的密码达人!