2015-09-06 86 views
0

我在一類Gui,我想遍歷和使用的值作爲一個庫函數的參數有一個名爲std::vector<const char*>log。問題是它似乎返回錯誤/錯誤類型的數據。的std ::矢量::爲const_iterator沒有指向所需的數據

void Gui::Message(const char *text, ...) 
{ 
    char buffer[256]; 
    va_list args; 
    va_start(args, text); 
    vsnprintf(buffer, 256, text, args); 
    va_end(args); 
    log.emplace(log.begin(), buffer); 
} 

這將正確格式化字符串並將其添加到向量中。如果我在緩衝區I emplace之後調用puts(log.front()),它會將正確的輸出打印到控制檯。此外,如果我使用emplace(text)而不是緩衝區,則在調用Gui::render()時顯示正確,但顯然未格式化。

void Gui::render() 
{ 
    int y = 1; 
    for(std::vector<const char*>::const_iterator iter = log.begin(); 
     iter != log.end(); iter++); 
    { 
     terminal_color("light grey"); 
     //takes x and y coordinates and a const char* and prints to the specified cell 
     terminal_printf(1, 45 + y, "%s", (*iter)); 
     y++; 
    } 
} 

現在,如果我叫puts((*iter))而不是終端打印功能,它仍然打印不正確的數據,所以它不會出現能與庫函數的一個問題。

重構存儲消息的數據結構是一個選項,但字符串需要能夠正確格式化並傳遞給庫打印函數。

回答

1

您的緩衝區是臨時存儲,僅在Message函數返回前有效。您正在保存指向緩衝區的指針,但在使用保存的指針之前其內容將消失。

如果你想要的東西,就像一個字符串,使用std::string,不誤const char*

0

您不是將const char*推到buffer上,而是將char刪除。

您使用string,讓您的生活更輕鬆。

+0

他推'爲const char *'(轉換後),問題是,它指出,向四周釋放存儲直線後。 –