'的std :: out_of_range'在substr字符串上

时间:2014-08-18 17:59:38

标签: c++ string substr outofrangeexception

我的一个脚本中遇到了一个小问题。 我有一个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

字符串被切割的原因是什么?

0 个答案:

没有答案