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

自定义密钥的字符串加解密代码: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 12:57:47