【发布时间】:2010-02-13 20:20:53
【问题描述】:
在调用 substr.确切的错误是
在抛出一个之后调用终止 “std::out_of_range”的实例
what(): basic_string::substr
我绝对确定 tmp_request 的长度大于 1。无论我将什么传递给 substr——1、2 或 bodypos——它总是会抛出该错误。我在 Unix 上使用 g++。
我能包含的唯一有趣的事情是字符串有多个"\r\n",包括一个"\r\n\r\n"。
在一个 cpp 文件中:
std::string tmp_request, outRequest;
tmp_request = SS_Twitter->readData();
outRequest = SS_Twitter->parse(tmp_request);
另一个:
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";
}
}
更新:
std::string request2("P\r\nregister\r\nusername=hello\r\n\r\n");
std::string body = request2.substr(4);
这会引发同样的错误。现在我知道这是完全有效且正确的代码,但它仍然抛出错误。 //删除源链接
【问题讨论】:
-
当涉及到语言时,一个东西是否是一个错误很少是一个意见。您应该严重怀疑这样一个原始函数在实现中是否存在错误,否则您会陷入错误的境地。你坚持你的代码是正确的,而实现是错误的,这一事实永远不会解决你的问题。显然,您在某处有逻辑错误;你必须放弃你的假设并重新开始。
-
这是错误的:
if(int(request.find("register"))!=std::string::npos)。npos是一个size_t,一个无符号整数,而int是一个有符号整数。零需要转换find的结果,而您所做的只是将范围减半。事实上,您将总是输入这个 if 语句,因为int可能永远无法达到size_t的最大值(这就是npos的值)。如果不是错误,那就是 a 错误。 -
我建议记录
request的长度和bodypos的值。这将确定您是否看到来自substr的不良行为,或者您是否传递了错误的参数。 -
我唯一一次在字符串方法(或在任何其他可能没有任何问题的地方)中看到一个神秘的“错误”,它与程序中其他地方的不相关的未定义行为有关.
-
我不知道为什么人们不赞成这个问题。这是有合法问题的合法代码,让我们帮助这个人找到它并清理我们的答案,以便他们帮助其他可能遇到类似问题的人。