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

Caesar加密算法C语言实现输出结果与预期不符问题求助

问题根因

  • 核心bug:字符匹配替换完成后未终止内层循环
    当代码匹配到a[i] == b[j]并完成偏移赋值后,内层for循环仍会继续遍历b数组的剩余元素,刚被修改的a[i]会再次匹配到b数组的其他位置,触发多次重复偏移,最终结果完全不符合预期。
  • 次要优化点:循环中重复调用strlen计算字符串长度会降低执行效率,且b数组固定长度为62,可直接固定取值无需重复计算。

修复方案

只需要在替换完成的分支后添加break;跳出内层循环即可,同时可以简化位移计算逻辑,用取模运算替代if else判断:

#include <string.h>
#include <stdio.h>
void caesar(char a[100], int k)
{
    int d= (11*k)%62; // Displacement interval
    char b[100] = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789";
    int b_len = strlen(b);
    int a_len = strlen(a);
    for (int i = 0; i < a_len; i++){ 
        for (int j=0;j < b_len;j++){ 
            if(a[i] == b[j])    
            {
                a[i] = b[(j + d) % b_len];
                break; // 匹配替换完成后直接跳出内层循环,避免重复替换
            }
        }
    }
}
int main()
{
    char a[100]= "DangVu";
    caesar(a,6);
    printf("%s",a);
    return 0;
}

运行结果

修复后代码输出为FcpiXw,和预期结果一致。

内容的提问来源于stack exchange,提问作者Đăng Trình Phạm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:15:07