MiraiForum

    • 注册
    • 登录
    • 搜索
    • 热门
    • 最新
    • 未解决
    • 标签
    • 群组
    • 友情链接

    mirai-cpp】string的api出错,但旁边用来测试的都正常

    开发交流
    2
    5
    460
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • xiling
      xiling 最后由 编辑

      一开始用的CString,写了好大一堆,一直出错我以为是CString的编码转换出了问题,然后这个”编码“一直搞不对了,我全删了单纯用string做,这次只写了一点点测试一下,结果一个substr都出问题,不报错的那种
      服务器响应解析出错传不上图片了)
      bot.On<GroupMessage>(
      [](GroupMessage jieshou) {
      string send = jieshou.MessageChain.GetPlainText();
      string shuchu = "error";
      if (send.substr(0, 4) == "名字") {
      shuchu = "已识别";
      在旁边的测试页可以正常运行(包括编码我都与这个一致了)
      我让它直接回复 send没有出错,问题就在send.substr(0,4)==这里了
      我读过好多遍详细文档了,水平太有限实在搞不定了

      是不是内部把string转成了别的东西,比如前后加了个引号之类的?这样我只要调一下字符串位置也就可以了(单纯由mirai-api-http的外表做的一点猜想)

      xiling 2 条回复 最后回复 回复 引用 0
      • xiling
        xiling @xiling 最后由 编辑

        @xiling 那里,,不是说水平不够读不懂详细文档,那个详细文档给的东西太少了,我的其他知识水平不够广

        1 条回复 最后回复 回复 引用 0
        • xiling
          xiling @xiling 最后由 编辑

          @xiling 好消息,它终于报错了!
          0x00007FFCFC89D759 处(位于 RepeatMessage.exe 中)引发的异常: Microsoft C++ 异常: nlohmann::detail::type_error,位于内存位置 0x00000004DB5FC4A0 处。

          我是这样,
          MessageChain msg=MessageChain().Plain(send.substr(0, 4));
          jieshou.Reply(msg);
          然后它终于报错的

          1 条回复 最后回复 回复 引用 0
          • C
            cyanray 最后由 编辑

            在 On 函数里抛出异常是不会导致程序崩溃的,所以一定要在里面捕捉异常,否则会错过很多东西。

            mirai-api-http 返回的数据都是 utf-8 编码的,如果你的 C++ 代码里有字符串字面量,那么你要保证你的源文件的编码也是 utf-8 编码的,才能用

            if (send.substr(0, 4) == "名字")
            

            这种判断。

            还有就是 utf-8 编码下,中文一般占用 3 个字节,两个汉字你只取4个字节,等于第二个汉字只取了一部分,nlohmann遇到不正确的utf-8编码会报错。

            我更建议你使用 正则表达式 或者 start_with。

            如果你可以使用 C++20:

            	string msg_str = m.MessageChain.GetPlainTextFirst();
            	string_view msg_view(msg_str);
            	if (!msg_view.starts_with("指令名称")) return;
            

            或者用 string::find

            string msg_str = m.MessageChain.GetPlainTextFirst();
            if(msg_str.find("指令名称") != 0) return;
            

            当然你的代码我没测试过,我只是猜测了下错误的原因,你可以去试试能不能解决。

            xiling 1 条回复 最后回复 回复 引用 1
            • xiling
              xiling @cyanray 最后由 编辑

              @cyanray 3个字节。。。。我当时没想到这里有问题。。。。。。啊啊应该就是这了、哇谢谢——以前的废稿又能用了好耶
              (utf-8我一开始就换编码了的。。。后来把cmd的编码也换成utf-8了qvq)

              1 条回复 最后回复 回复 引用 0
              • 1 / 1
              • First post
                Last post
              Powered by Mamoe Technologies & NodeBB | 友情链接 | 服务监控 | Contact