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
相关产品推荐
相关产品推荐

