首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >字符串中的未解释的out_of_range::substr

字符串中的未解释的out_of_range::substr
EN

Stack Overflow用户
提问于 2010-02-13 20:20:53
回答 5查看 6K关注 0票数 2

在调用substr时,我收到了一个关于std::out_of_range的非常恼人的错误。准确的错误是

在抛出'std::out_of_range‘实例后调用

what():basic_string::substr

我绝对相信tmp_request的长度大于1,无论我传递给substr-1,2,或bodypos,它总是抛出这个错误。我在Unix上使用g++。

我能包括的唯一有趣的事情是字符串有多个"\r\n",包括一个"\r\n\r\n"

在一个cpp文件中:

代码语言:javascript
运行
复制
std::string tmp_request, outRequest;

tmp_request = SS_Twitter->readData();
outRequest = SS_Twitter->parse(tmp_request);

在另一篇:

代码语言:javascript
运行
复制
 std::string parse(const std::string &request)
 {
  std::map<std::string,std::string> keyval;
  std::string outRequest;
  if(request[0]=='P')
  {
   if(request.find("register")!=std::string::npos)
   { //we have a register request
    size_t bodypos = request.find("username");
    if(bodypos==std::string::npos) 
    {
     HttpError(400,"Malformed HTTP POST request. Could not find key username.",request); 
    }
    else
    {
     std::string body = request.substr(bodypos);
     StringExplode(body,"&", "=",keyval);
     outRequest = "doing stuff";
    }

   }

更新:

代码语言:javascript
运行
复制
std::string request2("P\r\nregister\r\nusername=hello\r\n\r\n");

std::string body = request2.substr(4);

也会引发同样的错误。现在我知道这是完全有效和正确的代码,但它仍然抛出错误。//删除源链接

EN

Stack Overflow用户

发布于 2010-02-13 22:04:29

您的代码有一个相当明显的错误:

代码语言:javascript
运行
复制
int k = read(ns, buf, sizeof(buf)-1);
buf[k] = '\0';

您没有检查read()是否成功-它在失败时返回-1,如果发生这种情况,会导致各种内存损坏问题。

另外:

代码语言:javascript
运行
复制
char * buf2 = const_cast<char *>(reply.c_str());
write(ns,buf2,sizeof(buf2));

您正在接受指针的大小-您需要输出字符串的长度:

代码语言:javascript
运行
复制
write(ns, buf2, reply.size() );

您应该再次测试写成功的字节,并根据您的请求编写多少字节,尽管这不应该直接导致substr()错误。

票数 1
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2258900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档