我的一个脚本中遇到了一个小问题。 我有一个websocket的连接,消息由服务器发送到我的客户端。 格式是json。我写了一个简单的解释器来搜索引号。
功能标题:
ProcessEvent( string msg )
该功能如下所示:
size_t hasType = msg.find("type");
size_t length = msg.size();
/* type */
string date, name, message, color, room, roomname;
int pos = msg.find("type");
if(pos!=std::string::npos) {
msg = msg.substr(pos+7);
int pos2 = msg.find_first_of("\"");
string type = msg.substr(0, pos2);
msg = msg.substr(pos2);
基本问题在于:
/* message */
pos = msg.find("message");
if(pos!=std::string::npos) {
msg = msg.substr(pos+10);
pos2 = msg.find_first_of("\"");
cout << msg << endl;
CONSOLE_Print("size: "+UTIL_ToString(msg.size())+", pos2: "+UTIL_ToString(pos2));
message = msg.substr(0, pos2);
msg = msg.substr(pos2);
} else { message = "empty"; }
正如您所见,我已经尝试调试此问题。 问题只发生在长度很大的消息上(这是数据中唯一出现的问题)。 第二次调试的返回是这样的:
size: 949, pos2: -1
现在的问题是,输入客户端的示例是:
Lorem ipsum dolor sit amet,consetetur sadipscing elitr,sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua。在vero eos et accusam et justo duo dolores et ea rebum。 Stet clita kasd gubergren,no sea takimata sanctus est Lorem ipsum dolor坐着。 Lorem ipsum dolor坐在amet,consetetur sadilcing elitr,sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,sed diam voluptua。在vero eos et accusam et justo duo dolores et ea rebum。 Stet clita kasd gubergren,没有海 takimata sanctus est Lorem ipsum dolor sit amet。 Lorem ipsum dolor坐 amet,consetetur sadipscing elitr,sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,sed diam voluptua。 在vero eos et accusam et justo duo dolores et ea rebum。 Stet clita kasd gubergren,no sea takimata sanctus est Lorem ipsum dolor sit 阿梅德。
Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat,vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi。 Lorem ipsum dolor sit amet,consectetuer adipiscing elit,sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat。
Ut wisi enim ad minim veniam,quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat。 Duis autem 在vulputate velit esse molestie中的hendrerit中的vel eum iriure dolor 在vero eros et。的idequat,vel illum dolore eu feugiat nulla facilisis accumsan et iusto odio dignissim qui blandit praesent luptatum zzril Delenit augue duis dolore te feugait nulla facilisi。
Nam liber tempor cum soluta nobis eleifend option congue nihil 在白色背景下,无情的doming id quod mazim placerat facer
这是300个字符Lorem Ipsum。如果调试打印不再是300个字符,则为文本:
Lorem ipsum dolor sit amet,consetetur sadipscing elitr,sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua。在vero eos et accusam et justo duo dolores et ea rebum。 Stet clita kasd gubergren,no sea takimata sanctus est Lorem ipsum dolor坐着。 Lorem ipsum dolor坐在amet,consetetur sadilcing elitr,sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,sed diam voluptua。在vero eos et accusam et justo duo dolores et ea rebum。 Stet clita kasd gubergren,没有海 takimata sanctus est Lorem ipsum dolor sit amet。 Lorem ipsum dolor坐 amet,consetetur sadipscing elitr,sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,sed diam voluptua。 在vero eos et accusam et justo duo dolores et ea rebum。 Stet clita kasd gubergren,no sea takimata sanctus est Lorem ipsum dolor sit 阿梅德。 Duis autem vel eum iriure dolor in hendrerit in vulputate
这显然也是为什么它无法找到此消息的尾随引用的原因。在第一个文本上也没有尾随引用,我只是用来复制输入中的文本,这不是正常的格式。主要问题不是缺少引用,而是字符串被剥离而没有理由。 整个例外是:
terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::substr
Aborted
字符串被切割的原因是什么?