2012-01-24 35 views
0

以下是從哪個設來測試與服務器通信並獲得它的圖片的代碼的段:的atoi在C++結果segmentaion錯誤

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不功能太好,所以即時只在控制檯上工作)。

現在通過跟蹤記錄器消息,我推斷atoi(查看代碼的末尾)會導致分段錯誤。

考慮到另一個函數testXMLcomm工作正常,它看起來很相似,這真的很奇怪。

我包括標準輸入輸出和STDLIB ofcourse。

請幫忙!!!

回答

6

我想到飛機墜毀在該行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)

0

想象一下std::map headers中沒有關鍵的「Content-Length」。你的方法不是安全的。使用find函數來取代元素的迭代器。在對其內容進行操作之前測試迭代器。

有關示例見http://www.cplusplus.com/reference/stl/map/find/

然而,分割故障不能的這一結果(見註釋)。

+0

空字符串的'atoi'返回'0',就我們可以看到的代碼而言,這應該沒問題。 –

+0

當然可以。如果不存在,地圖將創建一個具有默認值的條目。 'c_str'將會返回一個正確的null結尾的空字符串。 –

+0

好了。 Thx指出。 – ypnos