自定义密钥的字符串加解密代码:ASCII值减法操作编译报错,加法无异常的原因排查
解决方法:把
&v换成v 你只需要把加密、解密循环里的&v全部替换成v——v才是存储你输入的密钥数值的变量。另外顺便帮你修复了原代码里的一个严重问题:gets函数已经被C标准废弃,容易导致缓冲区溢出,换成更安全的fgets:
#include <stdio.h> int main() { int i, x, v; char str[100]; printf("\nPlease enter a string:\t"); // 用fgets替代不安全的gets,限制读取长度 fgets(str, sizeof(str), stdin); // 去掉fgets自动读取的换行符(如果存在) for(i = 0; str[i] != '\0'; i++){ if(str[i] == '\n'){ str[i] = '\0'; break; } } printf("\nPlease enter encryption key:\t"); scanf("%d", &v); printf("\nPlease choose following options:\n"); printf("1 = Encrypt the string.\n"); printf("2 = Decrypt the string.\n"); scanf("%d", &x); switch(x) { case 1: for(i = 0; (i < 100 && str[i] != '\0'); i++) str[i] = str[i] + v; // 使用密钥变量v,而非地址&v printf("\nEncrypted string: %s\n", str); break; case 2: for(i = 0; (i < 100 && str[i] != '\0'); i++) str[i] = str[i] - v; // 同样替换为v printf("\nDecrypted string: %s\n", str); break; default: printf("\nError\n"); } return 0; }
额外小提示
你的加密逻辑是简单的凯撒密码变体,如果密钥过大或者字符加减后超出ASCII可打印范围,可能会出现乱码。如果只针对字母加密,可以优化成这样(以小写字母为例):
// 加密小写字母 str[i] = (str[i] - 'a' + v) % 26 + 'a'; // 解密小写字母 str[i] = (str[i] - 'a' - v + 26) % 26 + 'a';
这样能保证加密后的字符始终是小写字母,不会出现乱码。
内容的提问来源于stack exchange,提问作者Thalasotsanta
相关产品推荐
相关产品推荐

