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的修复,保证匹配用的原文s全程不会被修改
- 在内层循环的两个
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
相关产品推荐
相关产品推荐

