You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:24:04