You need to enable JavaScript to run this app. AlgoExpert C++凯撒密码练习题触发nlohmann JSON type_error求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 00:36:02