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

C++直接构造std::string与stringstream构建STOMP帧的差异问题

问题原因

核心是std::string从C风格字符串字面量构造的规则差异:

  • 你第一种写法用带\0的字符串字面量初始化std::string时,调用的是接收const char*参数的构造函数,这个构造函数会按照C字符串的终止规则,遇到第一个\0就停止读取内容,你手动加在末尾的\0不会被计入字符串的有效内容,最终生成的message里根本没有末尾的终止NULL字符,所以服务器解析时找不到终止符报错。
  • 第二种用std::stringstream的写法,你是显式把'\0'作为单个字符写入流,ss.str()生成std::string时会统计所有写入流的字符数,包括你最后加的\0,最终的消息末尾确实带了要求的NULL终止符,服务器可以正常解析。

直接用字符串字面量构造的修正方案

如果不想用stringstream,可以用两种写法保证末尾\0被计入消息:

  1. 显式指定字符串长度,把末尾的\0纳入统计:
const char raw_msg[] = "STOMP\naccept-version:1.2\nhost:transportforlondon.com\nlogin:fake_username\npasscode:fake_password\n\n\0";
const std::string message(raw_msg, sizeof(raw_msg) - 1);
  1. 用C++14及以上支持的字符串字面量后缀s,会自动将字面量内的\0识别为字符串内容的一部分:
using namespace std::string_literals;
const std::string message = "STOMP\naccept-version:1.2\nhost:transportforlondon.com\nlogin:fake_username\npasscode:fake_password\n\n\0"s;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:00:01