C语言加解密代码输入字符z输出异常且解密模块运行故障
问题分析与修复方案
现存问题
- 函数返回栈内存野指针:
encrypt和decrypt函数内的en、de都是局部栈数组,函数执行结束后内存会被系统回收,返回的指针指向无效内存,访问时会出现未定义行为,这是解密模块无法正常运行的核心原因。 - 加密解密偏移不匹配:加密逻辑是每个字符+1,解密逻辑是每个字符-3,偏移量不对称,就算其他逻辑正常也无法还原原始字符串。
z字符输出异常:小写字母z的ASCII码为122,直接+1后得到123,不属于字母范围,没有做字母循环偏移的处理,导致输出非预期字符。- 字符串遍历逻辑错误:循环固定遍历100次,不管输入字符串实际长度,会处理字符串结束符之后的垃圾内存数据。
- 使用已废弃的不安全函数
gets:该函数不检查输入长度,极易触发缓冲区溢出漏洞。
修复后完整代码
#include <stdio.h> #include <string.h> #include <ctype.h> // 加密函数,out为存储加密结果的缓冲区 void encrypt(const char *in, char *out) { int i = 0; while (in[i] != '\0') { if (islower(in[i])) { // 小写字母循环偏移,z+1转为a out[i] = (in[i] - 'a' + 1) % 26 + 'a'; } else if (isupper(in[i])) { // 大写字母循环偏移,Z+1转为A out[i] = (in[i] - 'A' + 1) % 26 + 'A'; } else { // 非字母字符逻辑可按需调整,此处保持+1规则 out[i] = in[i] + 1; } i++; } out[i] = '\0'; } // 解密函数,out为存储解密结果的缓冲区 void decrypt(const char *in, char *out) { int i = 0; while (in[i] != '\0') { if (islower(in[i])) { // 小写字母反向偏移,a-1转为z,+26避免负数取模异常 out[i] = (in[i] - 'a' - 1 + 26) % 26 + 'a'; } else if (isupper(in[i])) { // 大写字母反向偏移,A-1转为Z out[i] = (in[i] - 'A' - 1 + 26) % 26 + 'A'; } else { // 和加密逻辑对应,非字母字符直接-1 out[i] = in[i] - 1; } i++; } out[i] = '\0'; } int main() { char str[100], str1[100]; char result[100]; // 加密流程 printf("输入需要加密的字符串:\n"); fgets(str, sizeof(str), stdin); // 移除fgets读取到的末尾换行符 str[strcspn(str, "\n")] = '\0'; encrypt(str, result); printf("%s 加密后为 %s\n", str, result); // 解密流程 printf("输入需要解密的字符串:\n"); fgets(str1, sizeof(str1), stdin); str1[strcspn(str1, "\n")] = '\0'; decrypt(str1, result); printf("%s 解密后为 %s\n", str1, result); return 0; }
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

