AlgoExpert C++凯撒密码练习题触发nlohmann JSON type_error求助
AlgoExpert C++ 凯撒密码加密题调试异常
准备算法面试练习阶段,完成AlgoExpert平台C++方向凯撒密码加密题目时,自认为代码逻辑实现正确,但运行时触发平台抛出的类型错误,不清楚具体修复方案。初步推测问题可能和代码测试接口的格式实现逻辑相关,但无法确认,需要对应调试方向。
本次实现思路为基于ASCII表的整数值与字符类型互换,完成凯撒密码加密逻辑。
题目核心要求
对输入的小写字母字符串,按指定key值实现循环移位加密:字母移位超出小写z的范围时,绕回小写a的开头位置继续计数,最终返回加密后的字符串。
已提交的实现代码
using namespace std; string caesarCypherEncryptor(string str, int key) { int total; int index= 0; int rem; char val; for(char el: str) { total = (int)el + key; if(total > 122) { rem = (total - 122); val = (char) (97 + rem); str[index] = val; } else if(total < 122) { str[index] = (char)total; } index+=1; } return str; }
运行抛出的报错信息
terminate called after throwing an instance of 'nlohmann::detail::type_error' what(): [json.exception.type_error.316] invalid UTF-8 byte at index 0: 0x81 Aborted exit status 134
问题根因定位
- 报错本质不是测试接口的格式适配问题,是代码生成的返回字符串包含非法UTF-8字节,平台用JSON库序列化返回结果做测试匹配时,因字节不合法抛出类型异常。
- 第一处逻辑漏洞:未对key值做循环取模处理。小写字母一共26个,移位26次等价于无移位,当key值远大于26时,直接计算
el + key的数值会远大于122,此时计算得到的rem值会远大于25,直接用97 + rem得到的字符会超出小写字母的ASCII范围(97-122)。 - 第二处逻辑漏洞:循环移位的计算没有做范围闭环。当rem值超过25时,97 + rem的结果会超过127,成为高位的非可打印ASCII字节;这类字节不属于合法的单字节UTF-8字符,会直接触发平台的序列化报错。
- 第三处边界覆盖缺失:当计算得到的
total刚好等于122时,既不满足“大于122”分支,也不满足“小于122”分支,代码不会对当前位置的字符做任何修改,存在逻辑覆盖不全的问题。
修正后的参考实现
#include <string> using namespace std; string caesarCypherEncryptor(string str, int key) { // 先对key做26取模,消除整圈移位的冗余计算 int shift = key % 26; for (int i = 0; i < str.size(); i++) { char currentChar = str[i]; // 仅处理小写字母范围的字符 if (currentChar >= 'a' && currentChar <= 'z') { int newAscii = currentChar + shift; // 超出z的范围时,绕回a的起始位置 if (newAscii > 'z') { newAscii -= 26; } str[i] = (char)newAscii; } } return str; }
调试验证提示
- 可以优先在本地测试大key值的用例,比如key=100,输入为
"a",观察原代码计算出的返回值是否落在a-z的可打印字符范围内。 - 原代码生成的0x81字节对应的就是计算值超出ASCII可打印范围的结果,只要保证所有移位后的字符都落在97-122的区间内,平台的UTF-8序列化报错就会自然消失。
内容的提问来源于stack exchange,提问作者jesse26
相关产品推荐
相关产品推荐

