c++中的atoi导致分割错误
atoi in c++ results segmentaion error
以下是一段代码,该代码假设测试与服务器的通信并从中获取图片:
bool testPICcomm(){
Poco::Logger &logger = Poco::Logger::get("PictureTester");
logger.setLevel(Poco::Message::PRIO_DEBUG);
HttpClient* h = new HttpClient(host, 80);
std::map<std::string, std::string> headers;
Poco::UTF8Encoding utf;
Encoder encoder(utf);
h->connect();
h->sendHttpRequest(askForPic,"","",0,0);
if((h->getHttpHeaders(headers, encoder)) == false)
{
logger.debug("Couldn't Retrieve Headers "+ false);
h->close();
return false;
}
logger.debug("got headers");
//get head data
std::string mime = headers["Content-Type"];
logger.debug("mime type:" + mime);
logger.debug("length string: " + std::string((headers["Content-Length"]).c_str()));
int length= atoi((headers["Content-Length"]).c_str());
logger.debug("pic length:" + length);
...
我在linux上使用eclipse(eclipse功能不太好,所以我只在控制台上工作)。
现在,通过跟踪记录器消息,我推断atoi(查看代码的末尾)会导致分段错误。
考虑到另一个函数testXMLcomm运行良好并且看起来很相似,这真的很奇怪。
我当然包括了stdio和stdlib。
请帮忙!!!
我预计崩溃发生在logger.debug("pic length:" + length);
行。您在指向字符串文字的指针中添加了一个偏移量为length
的整数,并得到了一个无人区的地址。
你可能想写这样的东西:
ostringstream ss("pic length: ");
ss << length;
logger.debug(ss.str());
或者logger.debug("pic length: " + boost::lexical_cast<string>(length));
,或者C++11具有std::to_string(length)
。
想象一下std::map headers
中没有键"Content-Length"。你的方法不是故障保护的。
请改用find
函数来检索元素的迭代器。在对迭代器的内容进行操作之前,请先测试迭代器。
有关示例,请参见http://www.cplusplus.com/reference/stl/map/find/
但是,分割错误不可能是这一点的结果(请参阅注释)
相关文章:
- C++映射分割错误(核心转储)
- 由cin中的字符串中未捕获空白引起的分割错误
- 删除映射和分割错误中的一个过去结束元素
- 在指向函数中读取变量时出现分割错误
- 在链表中的第 n 位插入显示分割错误
- 较高值 n 的分割错误(例如 n=999997)
- 尝试通过memcpy复制大尺寸浮点向量时的分割错误
- 分割错误:向量中的擦除功能
- 向量向量的分割错误
- 我在C++中编写了一个方法来打印树类的预序,但它显示了分割错误
- C ++分割错误,为什么使用"long long"我没有得到答案?
- 在尝试使用递归查找集合子集的总数时,我遇到了分割错误
- 分割错误 11:尝试使用 cin 输入 B[1] 时
- 集合布局上的 Qt 分割错误
- 高达20亿的筛子会产生分割错误
- 对向量使用推回函数时的分割错误
- 绘制精灵会导致分割错误
- 将矢量的整数内容打印为字符串会导致分割错误
- 分割错误:使用向量时为 11 c++
- 结构的分割错误错误