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

CS50 Caesar密码代码修改副本c时原串s同步变更且输出全为a问题咨询

CS50 Caesar密码问题修复方案

异常1:修改字符串c时s同步变更

根因

CS50库封装的string本质是char *字符指针,string c = s仅完成指针地址拷贝,两个变量指向同一块堆内存,修改任意一个的字符内容都会影响另一个。

修复方法

单独为密文字符串申请独立内存,完成内容拷贝:

int length = strlen(s);
string c = malloc(length + 1); // 预留字符串结束符的1字节空间
strcpy(c, s);

使用结束后需调用free(c)释放内存避免泄漏。

异常2:密文全部输出为a

根因

存在两个触发条件:

  • 异常1导致的原文s和密文c共享内存,加密过程中修改c的同时会修改待匹配的原文s[i]
  • 内层j循环匹配到对应字母后没有跳出循环,同一个字符会被多次匹配、重复加密,随着j从0遍历到25,字符会被反复修改,最终迭代得到的结果固定为a

修复方法

  1. 先完成异常1的修复,保证匹配用的原文s全程不会被修改
  2. 在内层循环的两个if分支逻辑末尾都添加break,匹配到对应字母后直接终止本次内层循环,避免重复计算:
if(s[i] == alphabet[j])
{
    position = (j + key) % 26;
    c[i] = alphabet[position];
    printf("Ascii: %i + Key: %i.. Position = %i\n",j,key,position);
    position = 0;
    printf("Not Converted: %c\n",s[i]);
    printf("After conversion: %c\n\n",c[i]);
    break; // 新增break跳出内层循环
}
if(s[i] == ALPHABET[j])
{
    position = (j + key) % 26;
    c[i] = ALPHABET[position];
    printf("Ascii: %i + Key: %i.. Position = %i\n",j,key,position);
    position = 0;
    printf("After conversion: %c\n\n",c[i]);
    break; // 新增break跳出内层循环
}

内容的提问来源于stack exchange,提问作者John Doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 01:30:04